2010-12-02 45 views
11

我的表單上有一個選擇列表下拉框,其中填充了來自模型(導演)的數據。這個下拉列表的值不需要保存;它實際上只用於動態觸發表單的另一個元素(名爲Films的下拉列表)。因此,當用戶選擇一個導演時,它會動態地填充與該導演相關的電影的第二個列表。覆蓋一個Django表單元素上的數據驗證

第一份名單的第一項內容是「全部董事」。因爲選擇了所有導演,所以不用篩選電影列表,而是讓所有影片顯示在第二個列表中。

如果用戶選擇一個特定的導演,然後選擇電影,表單提交正確。問題是,如果用戶選擇所有導演,然後選擇一部電影,當提交表格時,它告訴我,我選擇導演是無效的,因爲它不是可用的選擇之一。在這種情況下,可用的選擇(我假設)是數據庫中現有的Director.objects之一。但因爲我不在乎導演,所以我不需要這個條目是有效的。我只需要電影是有效的。

我正在使用ModelForm。 如何禁用或覆蓋Director表單字段上的數據驗證,以便它忽略該字段生成的錯誤?

回答

26

最簡單的方法是定義用於驗證的形式,這樣你自己的方法:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = WhateverModel 

    def clean(self): 
     super(MyForm, self).clean() #if necessary 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
     return self.cleaned_data        

請參閱如何將其應用於ModelForms http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other瞭解更詳盡的解釋和http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

+0

`super(MyForm,self).clean()`它會允許默認的基於模型的驗證仍然活動? – andi 2014-03-27 18:14:48

+0

是的。在到達表單的乾淨方法之前,字段驗證器已經運行。您可以檢查它們是否在表單的「錯誤」屬性中生成了一些錯誤。 (Django 1.8) – 2016-03-31 09:47:22

6

出於某種原因接受的答案並沒有爲我工作(不知道它的原因時過境遷,或我使用的是直列的形式或者是什麼),但壓倒一切的工作full_clean:

class MyForm(forms.ModelForm): 
    def full_clean(self): 
     super(MyForm, self).full_clean() 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director']