2013-07-19 69 views
1

我有一種形式來照顧產品的添加和修改。 添加產品時,我想從驗證中排除modifyAttribute字段,並且當我修改產品時,我想從驗證中排除addAttribute字段。django:動態驗證排除字段

我「添加模式」時我輸入該的addAttribute字段和「修改模式」的值時,我輸入該modifyAttribute字段(文本框)的值英寸

如何做到這一點?哪裏?在視圖中?形成?

回答

0

它可能不是完美的解決方案,但我終於設計3種形式:1的共同領域,一個是添加字段,另一個用於修改字段。在我看來,我總是一次打兩個表格,只有那兩個表格需要驗證。

0

我建議你重寫窗體的clean()方法,因爲你需要一次訪問多個字段。 添加到字段驗證更容易,因爲您可以從對象的self.cleaned_data字典中訪問已清除的值,所以我建議您讓字段通過如果存在,然後引發異常/修改數據,因爲您認爲合適取決於案件。相關文件是here

例子:

class YourForm(forms.Form): 
    # Everything as before. 
    ... 

    def clean(self): 
     cleaned_data = super(YourForm, self).clean() 
     add_attribute = cleaned_data.get("add_attribute") 
     modify_attribute = cleaned_data.get("modify_attribute") 

     if modify_attribute and add_attribute: 
      raise forms.ValidationError("You can't add and 
            modify a product at the same time.") 

     if not modify_attribue and not add_attribute: 
      raise forms.ValidationError("You must either add or modify a product.") 
     # Always return the full collection of cleaned data. 
     return cleaned_data 

然後在你看來,你可以,如果做一件事modify_attribute和另一如果ADD_ATTRIBUTE,因爲現在你知道其中只有一個是存在的。

+0

您的解決方案是否排除驗證中的任何字段? – rom

+0

這取決於如何定義這些字段以及「排除驗證」的含義。如果兩個字段都是用'null = True,空白= True'定義的,那麼我的解決方案將驗證兩個字符中只有一個存在。如果這兩個字段都沒有'null = True,空白=真',那麼我的解決方案將不起作用。這就是我所說的,當我對字段進行驗證比刪除它更容易時,所以我建議你將這兩個字段設置爲可選。 – Basti

+0

好的,謝謝,我更喜歡尋找另一種解決方案,我不希望我的領域是可選的。 – rom

0

您可以在形式上__init__方法刪除字段,ModelForm它看起來像:

class AddModifyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(AddModifyForm, self).__init__(*args, **kwargs) 
     if self.instance.pk: 
      del self.fields['modifyAttribute'] 
     else: 
      del self.fields['addAttribute'] 

    class Meta: 
     model = YourModel 
     fields = ['addAttribute', 'modifyAttribute', ...] 
+0

是什麼意思?在我看來,我使用request.POST>中的 rom