我有一个我无法妥善保存的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',)
我尝试保存时运行调试程序会显示baz
和fields
中存在cleaned_data
,但除非我在Meta.fields
中声明它,否则它不会#39} ; t保存此字段。
我如何处理这种情况?我不知道在我的字段中是否需要baz
,直到初始化的表单 - 我如何在Meta类中表达这个条件?
编辑:完全不重复"如何使字段可选"式问题。使字段可选意味着它是静态声明的,这意味着您事先知道您的表单应该具有哪些字段,并且如果您不在模板中包含业务逻辑,则将使用其他表单字段进行呈现(我试图避免,因为它不属于我的情况)。这个问题涉及动态包括ModelForm中的字段,并且仍然能够成功调用save()方法。
答案 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',)