Juste pour exclure l'évidence - vous ne transmettez rien au constructeur de formulaire. L'avez-vous essayé avec instance=user_school
? Il pourrait y avoir plus qui a besoin de travail, mais je commencerai là.
Pour développer un peu - à votre avis, vous remplacez complètement le intégré get
méthode. C'est bien, mais cela signifie que vous contournez une partie du comportement automatisé de votre superclasse. Plus précisément, le get
méthode de ProcessFormView
(L'une de vos classes d'ancêtre) instancie la forme en utilisant le get_form
Méthode de la classe de vue. FormMixin
, un autre ancêtre, définit get_form
:
return form_class(**self.get_form_kwargs())
Et get_form_kwargs
sur ModelFormMixin
ajouter self.object
à la forme kwargs
:
kwargs.update({'instance': self.object})
Parce que vous êtes remplacé get
La méthode n'appelle pas get_form
, ça n'appelle pas non plus get_form_kwargs
et ne passe donc pas par tout le chemin qui fournit une liaison initiale pour la forme.
Personnellement, j'essaierais de gérer cela en modifiant le get_object
Méthode de votre vue personnalisée et laissant le reste seul:
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
Il peut y avoir plus de changements nécessaires - je n'ai pas testé cela - mais les deux get
et set
Méthodes Utilisation get_object
, et le lier au formulaire le cas échéant.