Django advanced learning record

高洛峰
Release: 2017-03-20 09:34:29
Original
1195 people have browsed it

Preface: This blog is a supplement to the previous blogdjangoAdvanced.

1. Rendering

Django advanced learning record

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

2. Implementation

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),
Copy after login

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})
Copy after login


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>
Copy after login

Next, implement the second function and create data.

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>
Copy after login

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})
Copy after login

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: {&#39;name&#39;: [&#39;新书A&#39;], &#39;csrfmiddlewaretoken&#39;: [&#39;V9OdHSJ10OFSq3r
vI41tggns1W2VxwV&#39;], &#39;publisher_id&#39;: [&#39;2&#39;], &#39;author_ids&#39;: [&#39;2&#39;, &#39;3&#39;]}>
------->>: 新书A 2 [&#39;2&#39;, &#39;3&#39;]
---->: <WSGIRequest: POST &#39;/payment/book/&#39;>
[18/Mar/2017 14:06:23] "POST /payment/book/ HTTP/1.1" 200 1335
Copy after login

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)
Copy after login

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.

Log in to the admin background to view the new book A just created:

Django advanced learning record

The above is the detailed content of Django advanced learning record. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template