模型窗体不会验证,因为缺少的字段是在clean()中分配的



我有一个ModelForm与一个自定义的保存方法来填充一个模型字段从url参数(传递到表单)的kwarg:

from app.models import MyModel
class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.fk_customer = kwargs.pop('customer')
        super(MyModelForm, self).__init__(*args, **kwargs)
    class Meta:
        model = MyModel
        fields = '__all__'
    def clean(self):
        cleaned_data = super(MyModelForm, self).clean()
        cleaned_data['fk_customer'] = self.fk_customer
        return cleaned_data

当我在我的视图中检查cleaned_data时,fk_customer存在并且有效。然而is_valid()是假的,ModelForm不会save()。如果我重写一些东西并强制保存,字段fk_customer被保存为None

发生了什么,我如何改变cleaned_data,仍然有效?

如果您的表单中没有显示customer字段,那么您应该将其从表单类中排除,而不是使用__all__

然后,我将尝试在表单的save方法而不是clean方法中设置客户。以下内容未经过测试:

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.customer = kwargs.pop('customer')
        super(MyModelForm, self).__init__(*args, **kwargs)
    class Meta:
        model = MyModel
        exclude = ('customer',)

    def save(self, commit=True)
        instance = super(MyModelForm, self).save(commit=False)
        instance.customer = self.customer
        if commit:
            instance.save()
            self.save_m2m()
        return instance

最新更新