[PYTHON] Implementieren Sie eine Schaltfläche zum Hinzufügen eines Formulars im Django-Inline-Formularsatz

Einführung

Der Inline-Formularsatz von Django eignet sich genau zum Erstellen von Eltern-Kind-Beziehungen, z. B. des Kopfteils einer Bestellung (Datum, Kundenname usw.) und der damit verbundenen Bestelldetails (Bestellung, Menge usw.). ist. (Handschriftliches Beispiel) Bis Sie sich daran gewöhnt haben, ist dies jedoch etwas verwirrend, da Sie mehrere Formulare gleichzeitig bearbeiten müssen. Bei der Bestellung enthält die Zeile ein Formular für die neue Eingabe der am Anfang festgelegten Nummer. Wenn Ihnen jedoch alle Formulare ausgehen und Sie eine neue Zeile wünschen, müssen Sie den zusätzlichen Vorgang selbst implementieren. Dafür ist jQuery unbedingt erforderlich.

In meinem Fall verstand ich das Inline-Formular nicht und jQuery stand kurz vor dem Studium, sodass es nicht wie erwartet funktionierte und es mir schwer fiel. Es ist einfach, wenn Sie alles verstanden haben. Wie kann ich eine Zeile hinzufügen? Ich werde so viel teilen, wie ich gelernt habe.

Dinge die zu tun sind

Verwenden Sie basierend auf dem Bestellformular jQuery, um eine Schaltfläche zum Hinzufügen eines Formulars zum Inline-Formularsatz zu implementieren.

Ich werde die Grundlagen von Python und Django nicht erklären.

Umgebung

Produktion

Beginnen wir mit einem normalen Inline-Formularsatz und sehen, wie Django so viele Formulare verwaltet. Im offiziellen Tutorial Es wird hier geschrieben (Die Erläuterung des Formularsatzes, aber die Formularverwaltung befindet sich auch im Inline-Formularsatz. Es wird das gleiche sein).

Die Quelle ist hier einfügen. Bitte geben Sie die Daten "Kunde" und "Produkt" auf dem Verwaltungsbildschirm ein.

Die Vorlage zum Anzeigen des Formulars lautet wie folgt. (Auszug)

jutyu_form.html (Auszug)


<form action="" method="POST">
    {{ form }}
    <hr>
    {{ formset.management_form }}
    <div id="detail-area">
        {% for detail in formset %}
            {{ detail.as_table }}
            <br>
        {% endfor %}
    </div>
    {% csrf_token %}
    <button class="btn btn-primary" type="submit">sparen</button>
</form>

{{form}} zeigt das "Bestelldatum" und "Kunde" im Kopfteil an. Der in Djangos Vorlagensprache geschriebene Teil wird für die Webanzeige in HTML konvertiert. Wie wird dieser Teil konvertiert? Versuchen Sie, die Seitenquelle in Ihrem Browser anzuzeigen. Django hat viele Dinge geschrieben. ↓ (Ich habe Notizen, Zeilenumbrüche usw. eingefügt.)

<!-- {{ form }}Inhalt von-->
<tr>
    <th><label for="id_jutyu_date">Bestelldatum:</label></th>
    <td>
        <input type="text" name="jutyu_date" value="2020-07-02" required id="id_jutyu_date">
        <input type="hidden" name="initial-jutyu_date" value="2020-07-02" id="initial-id_jutyu_date">
    </td>
</tr>
<tr>
    <th><label for="id_customer">Klient:</label></th>
    <td>
        <select name="customer" required id="id_customer">
        <option value="" selected>---------</option>
        <option value="1">Showa Kogyo</option>
        <option value="2">Heisei Seisakusho</option>
        </select>
    </td>
</tr>

Es scheint, dass "

Schreiben Sie einfach ein Wort "{{form}}" und es wird in den entsprechenden HTML-Code konvertiert. Es wird sehr hilfreich sein. Um es anders herum auszudrücken: Wenn Sie etwas anderes als die Konvertierung von Django anzeigen möchten, z. B. wenn Sie ein Leerzeichen anstelle von ":" am Ende des Beschriftungsnamens möchten oder wenn Beschriftung und Feld vertikal ausgerichtet werden sollen, geben Sie es in der Vorlage an. Da es so etwas nicht gibt, muss ich eine andere Methode anwenden.

Wie wird der Inline-Formularsatz verwaltet?

Werfen wir einen Blick auf den Inline-Formularsatz. Das Inline-Formset wird in der Ansicht instanziiert und mit dem Namen 'formset' an die Vorlage übergeben.

Dieser Teil der Vorlage

{{ formset.management_form }}
<div id="detail-area">
    {% for detail in formset %}
        {{ detail.as_table }}
        <br>
    {% endfor %}
</div>

Es wurde so in HTML konvertiert. ↓ (Ich habe Notizen, Zeilenumbrüche usw. eingefügt.) Es hat erheblich zugenommen. Es scheint, dass der Schlüssel zu diesem Thema in den Informationen verborgen ist, die auf verschiedene Weise zunehmen.

<!-- {{ formaset.management_form }}Inhalt von-->
<input type="hidden" name="jutyudetail_set-TOTAL_FORMS" value="1" id="id_jutyudetail_set-TOTAL_FORMS">
<input type="hidden" name="jutyudetail_set-INITIAL_FORMS" value="0" id="id_jutyudetail_set-INITIAL_FORMS">
<input type="hidden" name="jutyudetail_set-MIN_NUM_FORMS" value="0" id="id_jutyudetail_set-MIN_NUM_FORMS">
<input type="hidden" name="jutyudetail_set-MAX_NUM_FORMS" value="1000" id="id_jutyudetail_set-MAX_NUM_FORMS">

<div id="detail-area">
<tr>
    <th><label for="id_jutyudetail_set-0-part">Teile:</label></th>
    <td>
        <select name="jutyudetail_set-0-part" id="id_jutyudetail_set-0-part">
        <option value="" selected>---------</option>
        <option value="1">111-222 /Edelstahlverbindung</option>
        <option value="2">333-444 /O Ring</option>
        </select>
    </td>
</tr>
<tr>
    <th><label for="id_jutyudetail_set-0-quantity">Bestellmenge:</label></th>
    <td><input type="number" name="jutyudetail_set-0-quantity" id="id_jutyudetail_set-0-quantity"></td>
</tr>
<tr>
    <th><label for="id_jutyudetail_set-0-DELETE">Löschen:</label></th>
    <td>
        <input type="checkbox" name="jutyudetail_set-0-DELETE" id="id_jutyudetail_set-0-DELETE">
        <input type="hidden" name="jutyudetail_set-0-id" id="id_jutyudetail_set-0-id">
        <input type="hidden" name="jutyudetail_set-0-jutyu_head" id="id_jutyudetail_set-0-jutyu_head">
    </td>
</tr>
<br>
</div>
TOTAL_FORMS ist die Anzahl der enthaltenen Formulare

Es ist in HTML geschrieben, das aus {{formset.management_form}} erstellt wurde.

<input type="hidden" name="jutyudetail_set-TOTAL_FORMS" value="1" id="id_jutyudetail_set-TOTAL_FORMS">

Es gibt ein verstecktes Attribut "" mit einer langen ID. Diese Zeile stellt die Anzahl der Formulare dar, die im Inline-Formularsatz enthalten sind, wobei "value =" 1 "" ist. In diesem Fall ist es eine Zeile.

Jedes Feld hat eine ID, die angibt, zu welcher Form es gehört.

Was ist mit jedem Feld? So sieht beispielsweise der HTML-Code des Auswahlfelds zum Auswählen eines Teils aus.

<tr>
    <th><label for="id_jutyudetail_set-0-part">Teile:</label></th>
    <td>
        <select name="jutyudetail_set-0-part" id="id_jutyudetail_set-0-part">
        <option value="" selected>---------</option>
        <option value="1">111-222 /Edelstahlverbindung</option>
        <option value="2">333-444 /O Ring</option>
        </select>
    </td>
</tr>

Es besteht aus "