具有自定义字段表单的 ModelForm 的 UpdateView
UpdateView for ModelForm with custom field form
我有两个模型
Model A:
fieldA1
fieldA2
Model B:
fieldA = ForeignKey(A)
fieldB1
fieldB2
我需要创建 ModelFormB,但我还需要通过表单向模型 B 插入值。
所以我创建
ModelForm B:
fielda1 = form.CharField()
fielda2 = form.CharField()
class Meta:
model = ModelB
field = [fielda1, fielda2, fieldb1, fieldb2]
Mu更新查看代码:
class ModelBUpdateView(LoginRequiredMixin, UpdateView):
model = ModelB
form_class = ModelFormB
template_name = "....."
success_url = reverse_lazy('...')
问题是,在模板中我只能看到 ModelB(fieldb1,fieldb2) 实例初始值,但 fielda1 和 fielda2 完全空白。
如何在 updateview 期间将值发送到 fielda1 和 fielda2?
默认情况下,UpdateView 只会更新一个模型。您可以覆盖 get_initial() 和 form_valid() 以在保存模型 B 时更新模型 A。
class ModelBUpdateView(LoginRequiredMixin, UpdateView):
model = ModelB
form_class = ModelFormB
template_name = "....."
success_url = reverse_lazy('...')
def get_initial(self):
initial = super().get_initial()
initial['fielda1'] = self.object.fieldA.fieldA1
initial['fielda2'] = self.object.fieldA.fieldA2
return initial
def form_valid(self, form):
response = super().form_valid(form)
form.instance.fieldA.fieldA1 = form.cleaned_data['fielda1']
form.instance.fieldA.fieldA2 = form.cleaned_data['fielda2']
form.instance.fieldA.save()
return response
我有两个模型
Model A:
fieldA1
fieldA2
Model B:
fieldA = ForeignKey(A)
fieldB1
fieldB2
我需要创建 ModelFormB,但我还需要通过表单向模型 B 插入值。 所以我创建
ModelForm B:
fielda1 = form.CharField()
fielda2 = form.CharField()
class Meta:
model = ModelB
field = [fielda1, fielda2, fieldb1, fieldb2]
Mu更新查看代码:
class ModelBUpdateView(LoginRequiredMixin, UpdateView):
model = ModelB
form_class = ModelFormB
template_name = "....."
success_url = reverse_lazy('...')
问题是,在模板中我只能看到 ModelB(fieldb1,fieldb2) 实例初始值,但 fielda1 和 fielda2 完全空白。
如何在 updateview 期间将值发送到 fielda1 和 fielda2?
默认情况下,UpdateView 只会更新一个模型。您可以覆盖 get_initial() 和 form_valid() 以在保存模型 B 时更新模型 A。
class ModelBUpdateView(LoginRequiredMixin, UpdateView):
model = ModelB
form_class = ModelFormB
template_name = "....."
success_url = reverse_lazy('...')
def get_initial(self):
initial = super().get_initial()
initial['fielda1'] = self.object.fieldA.fieldA1
initial['fielda2'] = self.object.fieldA.fieldA2
return initial
def form_valid(self, form):
response = super().form_valid(form)
form.instance.fieldA.fieldA1 = form.cleaned_data['fielda1']
form.instance.fieldA.fieldA2 = form.cleaned_data['fielda2']
form.instance.fieldA.save()
return response