2011-08-17 86 views
7

我有ModelForm有幾個字段。一些領域是必需的,有些則不是。此外,我選擇不同的選擇字段,並且我希望根據此「選擇」字段選項製作一些「必需」字段。Django modelform根據其他字段選擇刪除「required」屬性

我在表格乾淨()方法試圖

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      self.fields['other_field'].required = False 
    return cleaned_data 

,但它不工作

回答

10

請參閱關於Cleaning and validating fields that depend on each other的Django文檔。標準的做法是執行以下操作來代替:

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      # 'other_field' is conditionally required. 
      if not cleaned_data['other_field']: 
       raise forms.ValidationError("'Other_field' is required.") 
    return cleaned_data 
+0

感謝。這個想法幫助我得到它! – Igor 2011-08-17 14:09:02

+0

我需要做一個類似的驗證(Django 1.4),但我測試的字段是隻讀的,所以我沒有在我的清潔數據(順便說一句 - 我在管理員做)。任何想法如何獲取這個只讀字段的值? 10x – Lin 2013-02-10 13:45:00

1

你有正確的想法,但問題是,個別字段驗證已經形式之前運行清潔。你有幾個選項。您可以使該字段不是必需的,並處理您在form.clean中需要的邏輯。或者您可以根據需要離開現場,並刪除可能會在清潔中產生的驗證錯誤。

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      if 'other_field' in self.errors: 
       del self.errors['other_field'] 
       cleaned_data['other_field'] = None 
    return cleaned_data 

這有它消除所有錯誤,不只是缺少/必需的錯誤一些問題。 cleaned_data也有問題。你現在有一個不在clean_data中的必填字段,這就是爲什麼我將它添加爲None。你的應用程序的其餘部分將不得不處理這種情況。擁有一個沒有價值的必填字段似乎很奇怪。

2

如果您想打印錯誤信息在常見的方式必填字段,你可以這樣做:

def clean(self): 
    cleaned_data = super(PasswordChangeForm, self).clean() 
    token = cleaned_data.get('token') 
    old_password = cleaned_data.get('old_password') 
    if not token and not old_password: 
     self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']])