在form_valid django

时间:2015-05-17 02:53:36

标签: django django-forms django-class-based-views formview

我有三个型号,Propietario,Administrador和Encargado。我有三种形式,ModelForm调用这些模型。表单可能有三个选项取决于用户:

  1. 如果用户选择了选项A,则会显示三个表单,其中可以填写每个表单的不同数据

  2. 如果用户选择了选项B,将显示两个表单,其中填写FormPropietario表单的数据将保存在Propietario模型中,并在Administrator模型中自动保存相同的数据。第二种形式是Encargado模型。

  3. 如果用户选择了选项C,则只会显示一个表单,此处填写的数据将保存在所有三个模型中。

  4. 注意:任何模型中填充的数据都将替换另一个,而不必创建新数据。我的意思是,如果用户在开始时选择了选项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)
    

    我已经做了好几天了,我不能把它付诸实践,我怎么能实现呢?提前谢谢。

0 个答案:

没有答案