Ich erstelle eine Support-Ticket-Tracking-App und habe einige Modelle, die ich auf einer Seite erstellen möchte. Tickets gehören einem Kunden über einen ForeignKey. Notizen gehören auch über einen ForeignKey zu Tickets. Ich möchte die Möglichkeit haben, einen Kunden auszuwählen (das ist ein ganz separates Projekt) ODER einen neuen Kunden zu erstellen, dann ein Ticket zu erstellen und schließlich eine dem neuen Ticket zugewiesene Notiz zu erstellen.
Da ich für Django ziemlich neu bin, arbeite ich in der Regel iterativ und probiere jedes Mal neue Funktionen aus. Ich habe mit ModelForms gespielt, möchte aber einige der Felder ausblenden und eine komplexe Validierung durchführen. Es scheint, als ob die von mir gesuchte Kontrollebene entweder Formsets erfordert oder alles von Hand erledigt, einschließlich einer mühsamen, handcodierten Vorlagenseite, die ich zu vermeiden versuche.
Gibt es eine schöne Funktion, die mir fehlt? Hat jemand eine gute Referenz oder ein gutes Beispiel für die Verwendung von Formsets? Ich habe ein ganzes Wochenende mit den API-Dokumenten für sie verbracht und bin immer noch ahnungslos. Ist es ein Designproblem, wenn ich alles zerlege und von Hand codiere?
quelle
Antworten:
Dies ist mit ModelForms nicht allzu schwer zu implementieren . Nehmen wir also an, Sie haben Formulare A, B und C. Sie drucken jedes Formular und jede Seite aus und müssen nun den POST bearbeiten.
Hier sind die Dokumente zur benutzerdefinierten Validierung.
quelle
Ich war vor einem Tag in ungefähr der gleichen Situation und hier sind meine 2 Cent:
1) Ich fand hier die wohl kürzeste und prägnanteste Demonstration mehrerer Modelleinträge in einer einzigen Form: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
Auf den Punkt gebracht: Machen Sie ein Formular für jedes Modell, legt sie sowohl auf Vorlage in einem einzigen
<form>
, mitprefix
Kurz Erstellen keyarg und lassen Sie die Ansichtsüberprüfung durchführen. Wenn eine Abhängigkeit besteht, stellen Sie einfach sicher, dass Sie das "übergeordnete" Modell vor der Abhängigkeit speichern und die ID des übergeordneten Elements für den Fremdschlüssel verwenden, bevor Sie das Speichern des "untergeordneten" Modells festschreiben. Der Link hat die Demo.2) Vielleicht können Formularsätze in geschlagen werden dies zu tun, aber so weit ich forschte in, Formularsätze sind in erster Linie für ein Vielfaches des gleichen Modells eingeben, das kann optional auf ein anderes Modell / Modelle von Fremdschlüssel gebunden werden. Es scheint jedoch keine Standardoption für die Eingabe von mehr als einem Modell zu geben, und dafür scheint Formset nicht gedacht zu sein.
quelle
Ich hatte vor kurzem ein Problem und habe gerade herausgefunden, wie das geht. Angenommen, Sie haben drei Klassen: Primary, B, C und B, C haben einen Fremdschlüssel für Primary
Mit dieser Methode sollten Sie die erforderliche Validierung durchführen und alle drei Objekte auf derselben Seite generieren können. Ich habe auch Javascript und versteckte Felder verwendet, um die Erzeugung mehrerer B, C-Objekte auf derselben Seite zu ermöglichen.
quelle
Das MultiModelForm von
django-betterforms
ist ein praktischer Wrapper, um das zu tun, was in Gnudiffs Antwort beschrieben ist . Es verpackt reguläreModelForm
s in eine einzelne Klasse, die transparent (zumindest für den grundlegenden Gebrauch) als einzelne Form verwendet wird. Ich habe ein Beispiel aus den folgenden Dokumenten kopiert.quelle
django-betterforms
die MultiModelForm- Klasse gesehen, bevor ich auf Ihre Antwort gestoßen bin . Ihre Lösung sieht wirklich gut aus, aber es scheint, dass sie seit einiger Zeit nicht mehr aktualisiert wurde. Verwenden Sie dieses @jozxyqk noch? Irgendwelche Probleme?Ich habe derzeit eine Problemumgehungsfunktion (sie besteht meine Komponententests). Es ist meiner Meinung nach eine gute Lösung, wenn Sie nur eine begrenzte Anzahl von Feldern aus anderen Modellen hinzufügen möchten.
Vermisse ich hier etwas?
quelle
"Ich möchte einige der Felder ausblenden und eine komplexe Validierung durchführen."
Ich beginne mit der eingebauten Admin-Oberfläche.
Erstellen Sie die ModelForm, um die gewünschten Felder anzuzeigen.
Erweitern Sie das Formular mit den Validierungsregeln im Formular. Normalerweise ist dies ein
clean
Methode.Stellen Sie sicher, dass dieser Teil einigermaßen gut funktioniert.
Sobald dies erledigt ist, können Sie sich von der integrierten Administrationsoberfläche entfernen.
Dann können Sie mit mehreren, teilweise verwandten Formularen auf einer einzelnen Webseite herumalbern. Dies ist eine Reihe von Vorlagen, mit denen alle Formulare auf einer einzigen Seite dargestellt werden können.
Dann müssen Sie die Ansichtsfunktion schreiben, um die verschiedenen Formulare zu lesen und zu validieren und die verschiedenen Objektspeicherungen durchzuführen ().
"Ist es ein Designproblem, wenn ich alles kaputt mache und von Hand codiere?" Nein, es ist nur viel Zeit für wenig Nutzen.
quelle
Laut Django-Dokumentation dienen Inline-Formsets zu diesem Zweck: "Inline-Formsets sind eine kleine Abstraktionsschicht über Modellformsets. Diese vereinfachen das Arbeiten mit verwandten Objekten über einen Fremdschlüssel."
Siehe https://docs.djangoproject.com/de/dev/topics/forms/modelforms/#inline-formsets
quelle