2015-02-10 90 views
0

我有一个Django ModelForm,我希望将一个字段视为有条件需要。我希望它在默认情况下是必需的,但根据另一个字段的值不需要。我的模型看起来沿着线的东西:不要求基于另一个字段值的字段

class MyModel(models.Model): 
    foo = models.BooleanField() 
    bar = models.CharField(choices=(('A', 'A'),('B', 'B'),('C', 'C')),) 

无论有null=Trueblank=True所以当我使我的形式,这是我想要的是“必需的”同时出现。

但是,我的表单模板上有一些javascript隐藏bar字段输入,具体取决于foo的输入值。在这种情况下,提交表单时,我不希望有任何关于bar的验证错误是必需的。

我想实现我的ModelForm的clean法这样的逻辑,就像这样:

def clean(self): 
    data = super(MyModelForm, self).clean() 
    if data.get('foo') == True and 'bar' in self.errors: 
     del self.errors['bar'] 
    return data 

然而,这似乎仍然给我一个“该字段不能为空。”错误。我注意到我的ModelForm也有一个_errors字典,但是如果我尝试添加del self._errors['bar'],我最终会遇到一个异常。

我已经找到了一些方法可以做到的我想的正好相反(12),这是没有被默认所需的字段,然后检查它应该在某些情况下需要在clean,但这不是我想要的是。

我也试过添加data['bar'] = " "作为解决方法,但后来我得到一个关于不选择其中一个选项的错误。理想情况下,我宁愿只是能够保存空字符串。

+0

if self.errors中的data.get('foo')和'bar': – mtnpaul 2015-02-10 00:20:38

+0

谢谢,这是正确的样式。但是,这并不影响我的问题。 – Joseph 2015-02-10 00:22:45

+0

你正在编辑或创建一个新的对象? – mtnpaul 2015-02-10 00:24:19

回答

1

这里的问题是,除了表单的clean方法被调用,form also calls post_clean on the form's instance。因为模型上的字段没有blank=True,所以在清理模型时会引发另一个错误并将其传递回表单。

要解决,请在模型上设置blank=True。这会导致字段在表单上显示为不需要的副作用。为了使窗体上所需的字段,只需将所需的标志初始化:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields['bar'].required = True 

这一点,除了在原有的问题clean方法,就足以创建默认情况下所需的条件必需的领域根据另一个字段的值不需要。

相关问题