2015-02-10 82 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方法,就足以創建默認情況下所需的條件必需的領域根據另一個字段的值不需要。

相關問題