如何在__init__中保存一个有条件声明字段而不在Meta类中的ModelForm?

时间:2018-01-27 08:42:53

标签: python django

我有一个我无法妥善保存的ModelForm:

class FooForm(forms.ModelForm):

    foobar = forms.IntegerField(required=True)

    def __init__(self, *args, **kwargs):
        baz = kwargs.pop('baz', None)
        super(FooForm, self).__init__(*args, **kwargs)
        if baz:
            self.fields['baz'] = forms.IntegerField(required=False)

    class Meta:
        model = FooBar
        fields = ('foobar',)

我尝试保存时运行调试程序会显示bazfields中存在cleaned_data,但除非我在Meta.fields中声明它,否则它不会#39} ; t保存此字段。

我如何处理这种情况?我不知道在我的字段中是否需要baz,直到初始化的表单 - 我如何在Meta类中表达这个条件?

编辑:完全不重复"如何使字段可选"式问题。使字段可选意味着它是静态声明的,这意味着您事先知道您的表单应该具有哪些字段,并且如果您不在模板中包含业务逻辑,则将使用其他表单字段进行呈现(我试图避免,因为它不属于我的情况)。这个问题涉及动态包括ModelForm中的字段,并且仍然能够成功调用save()方法。

2 个答案:

答案 0 :(得分:0)

我想你可以尝试手动保存模型,这意味着不要这样做:

if form.is_valid():
    form.save()

您可以执行以下操作:

if form.is_valid():
    if condition:
        YourModel.objects.create(...)

答案 1 :(得分:0)

我已经意识到,最简单的方法是避免完全触及表单的save方法,而是根据需要将字段添加到Meta类中:

def __init__(self, *args, **kwargs):
    baz = kwargs.pop('baz', None)
    super(FooForm, self).__init__(*args, **kwargs)
    if baz:
        self.fields['baz'] = forms.IntegerField(required=False)
        self._meta.fields += ('baz',)