[PYTHON] Speichern Sie mehrere Modelle in einem Formular mit Django

Weil der Adventskalender leer ist ...

Inhalt dieses Artikels

Formularbezogene APIs sind in Django relativ großzügig, aber wenn Sie versuchen, mehrere Modelle in einem Formular zu bearbeiten, wird dies plötzlich problematisch.

So kann ich die Dinge schnell erledigen, während ich das Modul benutze.

Es ist wie eine Fortsetzung des vorherigen Artikels.

Zu installierendes Modul

django-extra-views

pip install django-extra-views

Wie benutzt man

Tun Sie dies, weil zusätzliche Django-Ansichten ohne Verwendung einer Formularklasse erreicht werden können.

CreateView

Modell-

models.py


from django.db import models


class Person(models.Model):

    name = models.CharField(max_length=255)
    age = models.IntegerField(default=25) #Ich möchte zurück zu 25 gehen


class Car(models.Model):

    owner = models.ForeignKey(Person)
    color = models.CharField(max_length=10)

views.py

views.py


from extra_views import CreateWithInlinesView, InlineFormSet


class CarInlineFormSet(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = False  #In der Erstellungsansicht muss nicht gelöscht werden


class PersonCarCreateFormsetView(CreateWithInlinesView):
    model = Person
    fields = ("name", "age")  # self.Modellfelder
    inlines = [CarInlineFormSet, ]
    template_name = "person_formset.html"
    success_url = "/"

Vorlage

person_formset.html


{% extends "base.html" %}

{% block content %}

    <form method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>

                {#Inline wird in einer Variablen namens Inlines aufgelistet#}
        <p>Car Color</p>
        <table>
            {% for form in inlines %}
                {{ form.as_table }}
            {% endfor %}
        </table>
        <button type="submit">save</button>
    </form>

{% endblock %}

UpdateView

Modell-

das Gleiche

views.py

views.py


from extra_views import InlineFormSet, UpdateWithInlinesView

class CarInlineFormSetCanDelete(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = True

class PersonCarUpdateFormsetView(UpdateWithInlinesView):
    model = Person
    fields = ("name", "age")
    inlines = [CarInlineFormSetCanDelete, ]
    template_name = "person_formset.html"
    success_url = "/"

Vorlage

das Gleiche

Zusammenfassung

Sehr angenehm.


Nachtrag 2017-09-27

So zeigen Sie andere als as_table an

Wenn Sie es normal schreiben, möchten Sie das Inline-Schreiben wie "table.name" schreiben.

Ich war ein bisschen süchtig danach

template.html



{% for inline in inlines %}
  {% for line in inline %}
     {{ line.name }}
  {% endfor %}
{% endfor %}

Sie können eine Doppelschleife wie diese ausführen. Dies liegt wahrscheinlich daran, dass mehrere Inline-Modelle für "Inlines" festgelegt sind.

Nachtrag bis hierher


Recommended Posts

Speichern Sie mehrere Modelle in einem Formular mit Django
Modell in Django
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
Erstellen Sie mit Django dynamisch Tabellen im Schema und generieren Sie dynamisch Modelle
Verwenden Sie Django, um Tweet-Daten zu speichern
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
Django Geändert, um viele Daten gleichzeitig zu speichern
Laden Sie die Django-Shell mit ipython neu
Fügen Sie in Django dynamisch Formularfelder hinzu
Wechseln Sie mit dem M5 Stick V zwischen mehreren Modellen
GraphQL-API mit graphene_django in Django
Zwei Möglichkeiten, mit matplotlib mehrere Grafiken in einem Bild anzuzeigen
Behandeln Sie mehrere Python-Versionen in einem Jupyter
Arbeiten mit mehreren Django-Projekten unter Apache (WSGIDaemonProcess)
Verarbeiten Sie mehrere Listen mit for in Python
Einzeiler webServer (mit CGI) in Python
Fügen Sie Formularobjekten mit Django dynamisch Felder hinzu
Verbinden Sie mit OpenCV mehrere Videos auf einmal!
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Melden Sie sich einfach mit mehreren Konten bei AWS an
In einem Fenster werden mehrere Grafiken angezeigt (Python).
[Python] Umgang mit mehreren Aufruffehlern in ray.init
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Django Anfrageformular 2
Internationalisierung mit Django
CRUD mit Django
Django Vorgeschlagene Form
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
Hebe die gefallenen Ohren von Django Form auf
Form in Django
Django Kontaktformular
So erhalten Sie mehrere Modellobjekte zufällig in Django
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
Setzen Sie DateField des Formulars in Django auf type = date
Implementieren Sie hierarchische URLs mit drf-verschachtelten Routern im Django REST-Framework
So registrieren Sie dieselben Daten mehrmals mit einer Eingabe auf dem Verwaltungsbildschirm von Django
[Django] Eine Geschichte über das Feststecken in einem Sumpf beim Versuch, einen Reißverschluss mit einem Formular zu validieren [TDD]