Ist es möglich, ModelForm
in Django mehrere Modelle in einem einzigen zu haben? Ich versuche, ein Profilbearbeitungsformular zu erstellen. Daher muss ich einige Felder aus dem Benutzermodell und dem UserProfile-Modell einfügen. Derzeit verwende ich 2 Formulare wie dieses
class UserEditForm(ModelForm):
class Meta:
model = User
fields = ("first_name", "last_name")
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ("middle_name", "home_phone", "work_phone", "cell_phone")
Gibt es eine Möglichkeit, diese in einem Formular zu konsolidieren, oder muss ich nur ein Formular erstellen und das Laden und Speichern der Datenbank selbst durchführen?
python
django
django-forms
Jason Webb
quelle
quelle
Antworten:
Sie können einfach beide Formulare in der Vorlage innerhalb eines
<form>
HTML-Elements anzeigen. Verarbeiten Sie dann einfach die Formulare separat in der Ansicht. Sie können die Datenbank weiterhin verwendenform.save()
und müssen sie nicht selbst verarbeiten und speichern.In diesem Fall sollten Sie es nicht benötigen, aber wenn Sie Formulare mit denselben Feldnamen verwenden
prefix
möchten , suchen Sie im kwarg nach Django-Formularen. (Ich habe hier eine Frage dazu beantwortet ).quelle
<form>
Element kombiniert ?FormView
nur eine einzigeform_class
zugeordnet.TemplateView
und implementieren Sie einfach dieselbe Logik wie in FormView, jedoch mit mehreren Formularen.Sie können versuchen, diesen Code zu verwenden:
Anwendungsbeispiel:
quelle
admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
UpdateView
?erikbwork und ich hatten beide das Problem, dass man nur ein Modell in eine generische klassenbasierte Ansicht aufnehmen kann. Ich fand eine ähnliche Herangehensweise wie Miao, aber modularer.
Ich habe ein Mixin geschrieben, damit Sie alle generischen klassenbasierten Ansichten verwenden können. Definieren Sie Modell, Felder und jetzt auch child_model und child_field - und dann können Sie Felder beider Modelle in ein Tag einschließen, wie Zach es beschreibt.
Anwendungsbeispiel:
Oder mit ModelFormClass:
Getan. Hoffe das hilft jemandem.
quelle
save_child_form.course_key = self.object
, was ist.course_key
?return self.child_form_class(**self.get_form_kwargs())
, dass es in der Methode get_child_form aufruft, aber die falsche Modellinstanz erhältkwargs['instance']
, z. B. ist die Instanz das Hauptmodell und nicht das untergeordnete Modell. Um dies zu beheben, müssen Sie zuerst kwargs in einer Variablen speichern undkwargs = self.get_form_kwargs()
dannkwargs['initial']
vor dem Aufruf mit der richtigen Modellinstanz aktualisierenreturn self.child_form_class(**kwargs)
. In meinem Fall war das,kwargs['instance'] = kwargs['instance'].profile
wenn dies Sinn macht.model_forms
?Sie sollten sich wahrscheinlich Inline-Formsets ansehen . Inline-Formsets werden verwendet, wenn Ihre Modelle durch einen Fremdschlüssel verknüpft sind.
quelle
Sie können meine Antwort hier auf ein ähnliches Problem überprüfen .
Es wird erläutert, wie Registrierung und Benutzerprofil in einem Formular kombiniert werden. Es kann jedoch auf jede ModelForm-Kombination verallgemeinert werden.
quelle
Früher habe ich django betterforms ‚s Multiform und MultiModelForm in meinem Projekt. Der Code kann jedoch verbessert werden. Zum Beispiel ist es abhängig von django.six, das von 3. + nicht unterstützt wird, aber all dies kann leicht behoben werden
Diese Frage hat sich gezeigt , mehrere Male in Stackoverflow, so dass ich es an der Zeit denke , mit dieser eine standardisierte Art und Weise des Umgangs zu finden.
quelle