Home > Article > Backend Development > Django advanced learning record
Preface: This blog is a supplement to the previous blogdjangoAdvanced.
The front-end interface is relatively simple (ugly) and has two functions:
Get the book title from the database eg: New book A
Enter the title of the book in the form, select the publisher, and select the author ( Multiple selection), after completing the input, click Create New Book Submit to create data in the database
Let’s implement the first function first, printing the book title on the page based on the database data.
1. Add urlrouting
url(r'^book/', views.book),
2. Define the book method in views.py
Django uses the GET method by default, that is, to obtain data; if you want to create/modify data, such as the second function to be implemented later, you need to use the POST method.
def book(request): books = models.Book.objects.all() #找到所有的书 publisher_list = models.Publisher.objects.all() author_list = models.Author.objects.all() print("---->:", request) return render(request, "app01/book.html", {"books":books, "publishers":publisher_list, "authors":author_list})
3. Create book.html under templates/app01:
books is in the database A collection of objects for all books. Use a loop in HTML to display the book titles on the front-end page.
<h2>书列表:</h2> <ul> {% for book in books %} <li>{{ book.name }}</li> {% endfor %} </ul>
Let’s look at the front-end html first:
<form method="post" action="/payment/book/"> {% csrf_token %} book name:<input type="text" name="name"/> <select name="publisher_id"> {% for publisher in publishers %} <option value="{{ publisher.id }}">{{ publisher.name }}</option> {% endfor %} </select> <select name="author_ids" multiple="multiple"> {% for author in authors %} <option value="{{ author.id }}">{{ author.first_name }}</option> {% endfor %} </select> <div> <input type="submit" value="创建新书"/> </div> </form>
Note:
Because It is to create data, so the submission method must use post, action="/payment/book/" is a url, which means submitting the data to the book method, and the data is encapsulated in the request parameter.
When you select a publishing house, do you need to send the name of the publishing house to the backend? Therefore, I added the value attribute to the option tag to obtain the id of the publisher. When you click submit to submit the data, the id in the value will be submitted to the name attribute of the select tag, name The attribute then submits the data to the background.
You will find that the first line of the html code has {% csrf_token %}. I don’t know what this means yet~_~, I If you remove this code, the data will not be submitted!!
Let’s look at the background book method
def book(request): if request.method == "POST": #若是创建书的数据 print(request.POST) book_name = request.POST.get("name") publisher_id = request.POST.get("publisher_id") # 即使在前端页面选择多个作者只会返回一个值,只能取到最后一个作者的id #author_ids = request.POST.get("author_ids") author_ids = request.POST.getlist("author_ids") #getlist 可取出所有作者的id #生成一个书的对象 new_book = models.Book( name = book_name, publisher_id = publisher_id, publish_date = "2017-3-18" ) new_book.save() #同步到数据库 #new_book.authors.add(1,2) 添加作者 new_book.authors.add(*author_ids) #author_ids为列表,需在前面加上*转化为id print("------->>:", book_name,publisher_id,author_ids) books = models.Book.objects.all() publisher_list = models.Publisher.objects.all() author_list = models.Author.objects.all() print("---->:", request) return render(request, "app01/book.html", {"books":books, "publishers":publisher_list, "authors":author_list})
When I enter the book title in the front-end interface: New Book A, select the second publisher, select the 2nd and 3rd authors, for the convenience of viewing, I print it out in the background:
<QueryDict: {'name': ['新书A'], 'csrfmiddlewaretoken': ['V9OdHSJ10OFSq3r vI41tggns1W2VxwV'], 'publisher_id': ['2'], 'author_ids': ['2', '3']}> ------->>: 新书A 2 ['2', '3'] ---->: <WSGIRequest: POST '/payment/book/'> [18/Mar/2017 14:06:23] "POST /payment/book/ HTTP/1.1" 200 1335
According to the printing results, I know that author_ids is a list. When I add an author to a book, I use the following code:
new_book.authors.add(*author_ids)
Why do I need to add * in front of the list? Not adding * will expose an error! Adding * is to convert the list form ["2", "3"] into the author id form 2,3.
The above is the detailed content of Django advanced learning record. For more information, please follow other related articles on the PHP Chinese website!