Nur um das Offensichtliche auszuschließen - Sie geben nichts an den Formularkonstruktor. Hast du es mit damit versucht mit instance=user_school
? Es mag mehr geben, das Arbeit braucht, aber ich würde dort anfangen.
Um dies ein wenig zu erweitern - in Ihrer Ansicht überschreiben Sie das eingebaute in die Einbau. get
Methode. Das ist in Ordnung, aber es bedeutet, dass Sie einige der automatisierten Verhaltensweisen Ihrer Sichtweise Superclass umgehen. Insbesondere die get
Methode von ProcessFormView
(Eine Ihrer Vorfahren) instanziiert die Form mit dem Form get_form
Methode der View -Klasse. FormMixin
, ein anderer Vorfahr, definiert get_form
:
return form_class(**self.get_form_kwargs())
Und get_form_kwargs
an ModelFormMixin
fügt hinzu self.object
zur Form des Formulars kwargs
:
kwargs.update({'instance': self.object})
Weil du überschrieben bist get
Methode wird nicht aufgerufen get_form
, Es ruft auch nicht an get_form_kwargs
und geht daher nicht den gesamten Weg durch, der eine anfängliche Bindung für das Formular liefert.
Ich persönlich würde versuchen, dies zu behandeln, indem ich das ändern würde get_object
Methode Ihrer benutzerdefinierten Ansicht und lassen Sie den Rest in Ruhe:
class EditSchool(UpdateView):
model = School
success_url = reverse_lazy('list_schools')
form_class = UserSchoolForm
def get_object(self, queryset=None):
school = super(EditSchool, self).get_object(queryset=queryset)
user_school, created = UserSchool.objects.get_or_create(
master_school=school, user=self.request.user,
defaults={'name' : school.name, 'mascot' : school.mascot})
return user_school
Möglicherweise werden mehr Änderungen benötigt - ich habe das nicht getestet - aber beide get
und set
Methoden verwenden get_object
, und binden Sie es gegebenenfalls an die Form.