我有三个型号,Propietario,Administrador和Encargado。我有三种形式,ModelForm调用这些模型。表单可能有三个选项取决于用户:
如果用户选择了选项A,则会显示三个表单,其中可以填写每个表单的不同数据
如果用户选择了选项B,将显示两个表单,其中填写FormPropietario表单的数据将保存在Propietario模型中,并在Administrator模型中自动保存相同的数据。第二种形式是Encargado模型。
如果用户选择了选项C,则只会显示一个表单,此处填写的数据将保存在所有三个模型中。
注意:任何模型中填充的数据都将替换另一个,而不必创建新数据。我的意思是,如果用户在开始时选择了选项A并填充了三个不同的数据,然后选择选项C,则选项C中填写的数据必须替换其他模型中的数据,而不必创建新数据。
为实现这一目标,我一直在尝试使用此代码:
形式:
class FormPropietario(ModelForm):
def __init__(self, *args, **kwargs):
super(FormPropietario, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Propietario
exclude = ("predio",'rol',)
widgets = {
'fecha_nacimiento' : forms.DateInput(attrs={'type':'date'}),
}
class FormAdministrador(ModelForm):
def __init__(self, *args, **kwargs):
super(FormAdministrador, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Administrador
exclude = ("predio",'rol')
class FormEncargado(ModelForm):
def __init__(self, *args, **kwargs):
super(FormEncargado, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Encargado
exclude = ("predio",'rol',)
处理选项A的视图工作正常:
#PAE
class PAEPropietarioView(UpdateModelMixin,UpdateView):
model = Propietario
form_class = FormPropietario
success_url = '/'
template_name = 'productores/PAE/propietario.html'
def form_valid(self,form):
propietario = Propietario()
propietario = form.save(commit=False)
propietario.rol.add(1)
return super(PAEPropietarioView,self).form_valid(form)
但问题是处理选项B或C的视图。我现在有这个但没有成功:
class PropietarioAndAdministratorView(UpdateModelMixin,UpdateView):
model = Propietario
form_class = FormPropietario
success_url = '/'
template_name = 'productores/PE/propietario.html'
def form_valid(self, form):
is_valid = super(PropietarioAndAdministratorView,self).form_valid(form)
if is_valid:
admin = Administrador.objects.get_or_create(predio_id=self.kwargs['predio_id'],**form.cleaned_data)
return True
return False
我也试过这一行,但没有任何反应:
def form_valid(self, form):
Administrador.objects.get_or_create(predio_id=1,**form.cleaned_data)
return super(PropietarioAndAdministratorView, self).form_valid(form)
我认为我很接近,但是以下行有错误;有效地保存在管理员但保存两次,一个与数据,另一个为空。为什么?
Administrador.objects.get_or_create(predio_id=self.kwargs['predio_id'],**form.cleaned_data)
我已经做了好几天了,我不能把它付诸实践,我怎么能实现呢?提前谢谢。