Heim  >  Artikel  >  Backend-Entwicklung  >  Django-Lernaufzeichnung für Fortgeschrittene

Django-Lernaufzeichnung für Fortgeschrittene

高洛峰
高洛峰Original
2017-03-20 09:34:291155Durchsuche

Vorwort: Dieser Blog ist eine Ergänzung zum vorherigen Blog djangoAdvanced.

1. Rendering

Django-Lernaufzeichnung für Fortgeschrittene

Die Front-End-Schnittstelle ist relativ einfach (hässlich) und hat zwei Funktionen:

  • Buchtitel aus der Datenbank abrufen, z. B.: Neues Buch A

  • Buchtitel in das Formular eingeben, auswählen Geben Sie den Verlag ein und wählen Sie den Autor aus (Mehrfachauswahl). Klicken Sie nach der Eingabe auf „Neues Buch erstellen“. Senden. Die Daten werden in der Datenbank erstellt

2. Implementierung

Lassen Sie uns zuerst die erste Funktion implementieren und den Buchtitel basierend auf den Datenbankdaten auf der Seite drucken.

1. URL hinzufügenRouting

    url(r'^book/', views.book),

2. Definieren Sie die Buchmethode in „views.py“

Django verwendet standardmäßig die GET-Methode. Wenn Sie also Daten erstellen/ändern möchten, z. B. die zweite Funktion, die später implementiert werden soll, müssen Sie die POST-Methode verwenden .

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. Erstellen Sie book.html unter templates/app01:

books is A Sammlung von Objekten für alle Bücher in der Datenbank. Verwenden Sie eine Schleife in HTML, um die Buchtitel auf der Startseite anzuzeigen.

<h2>书列表:</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.name }}</li>
        {% endfor %}
    </ul>

Als nächstes implementieren Sie die zweite Funktion und erstellen Daten.

Schauen wir uns zuerst das Front-End-HTML an:

<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>

Hinweis:

  • Da wir Daten erstellen, muss die Übermittlungsmethode „post“ sein. action="/zahlung/buch/" ist eine URL, was bedeutet, dass die Daten an die Buchmethode übermittelt werden, und die Daten werden in der eingekapselt Anforderungsparameter.

  • Müssen Sie bei der Auswahl eines Herausgebers den Namen des Herausgebers an das Backend übergeben? Tatsächlich ist das überhaupt nicht notwendig, Sie müssen es nur tun Übergeben Sie die ausgewählte ID an das Backend. Daher habe ich dem Options-Tag den Wert Attribut hinzugefügt, um die ID des Herausgebers zu erhalten. Wenn Sie auf „Senden“ klicken, um die Daten zu senden, wird die ID im Wert an das Namensattribut von gesendet Das Select-Tag und das Name-Attribut senden die Daten dann an den Hintergrund.

  • Sie werden feststellen, dass die erste Zeile des HTML-Codes {% csrf_token %} enthält, ich weiß noch nicht, was das bedeutet~_ ~, ich Wenn Sie diesen Code entfernen, werden die Daten nicht übermittelt!!

Sehen wir uns die Hintergrundbuchmethode an

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})

Wenn ich den Buchtitel in die Frontend-Oberfläche eingebe: Neues Buch A, wähle den zweiten Verlag, wähle den 2. und 3. Autor aus, um die Anzeige zu erleichtern, drucke ich es aus der Hintergrund:

<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

Laut dem Druckergebnis weiß ich, dass es sich bei „author_ids“ um eine Liste handelt. Wenn ich einem Buch einen Autor hinzufüge, verwende ich den folgenden Code:

new_book.authors.add(*author_ids)

Warum sollte ich es vor der Liste hinzufügen *? Wenn Sie kein * hinzufügen, wird ein Fehler angezeigt! Durch das Hinzufügen von * wird die Listenform [„2“, „3“] in die Autoren-ID-Form 2,3 konvertiert.

Melden Sie sich im Admin-Hintergrund an, um das neue Buch A anzusehen, das gerade erstellt wurde:

Django-Lernaufzeichnung für Fortgeschrittene

Das obige ist der detaillierte Inhalt vonDjango-Lernaufzeichnung für Fortgeschrittene. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn