明らかなことを排除するために - あなたはフォームコンストラクターに何も渡していません。一緒に試しましたか instance=user_school
?それ以上の仕事が必要かもしれませんが、私はそこから始めます。
これを少し拡張するために - あなたの見解では、あなたはビルトインを完全に無効にしています get
方法。それは問題ありませんが、それはあなたがあなたのビュースーパークラスの自動化された動作の一部をバイパスしていることを意味します。具体的には、 get
の方法 ProcessFormView
(あなたの祖先クラスの1つ)を使用してフォームをインスタンス化します get_form
ビュークラスの方法。 FormMixin
, 、別の祖先が定義します get_form
:
return form_class(**self.get_form_kwargs())
と get_form_kwargs
の上 ModelFormMixin
追加します self.object
フォームに kwargs
:
kwargs.update({'instance': self.object})
あなたがオーバーライドされたからです get
メソッドは呼び出されません get_form
, 、電話もありません get_form_kwargs
したがって、フォームの初期バインディングを提供するパス全体を通過しません。
私は個人的にこれを変更しようとします get_object
カスタムビューの方法と残りのままにしておく:
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
より多くの変更が必要かもしれません - 私はこれをテストしていません - しかし両方 get
と set
使用方法 get_object
, 、必要に応じてフォームにバインドします。