我有一種形式來照顧產品的添加和修改。 添加產品時,我想從驗證中排除modifyAttribute字段,並且當我修改產品時,我想從驗證中排除addAttribute字段。django:動態驗證排除字段
我「添加模式」時我輸入該的addAttribute字段和「修改模式」的值時,我輸入該modifyAttribute字段(文本框)的值英寸
如何做到這一點?哪裏?在視圖中?形成?
我有一種形式來照顧產品的添加和修改。 添加產品時,我想從驗證中排除modifyAttribute字段,並且當我修改產品時,我想從驗證中排除addAttribute字段。django:動態驗證排除字段
我「添加模式」時我輸入該的addAttribute字段和「修改模式」的值時,我輸入該modifyAttribute字段(文本框)的值英寸
如何做到這一點?哪裏?在視圖中?形成?
它可能不是完美的解決方案,但我終於設計3種形式:1的共同領域,一個是添加字段,另一個用於修改字段。在我看來,我總是一次打兩個表格,只有那兩個表格需要驗證。
我建議你重寫窗體的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,因爲現在你知道其中只有一個是存在的。
您可以在形式上__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', ...]
您的解決方案是否排除驗證中的任何字段? – rom
這取決於如何定義這些字段以及「排除驗證」的含義。如果兩個字段都是用'null = True,空白= True'定義的,那麼我的解決方案將驗證兩個字符中只有一個存在。如果這兩個字段都沒有'null = True,空白=真',那麼我的解決方案將不起作用。這就是我所說的,當我對字段進行驗證比刪除它更容易時,所以我建議你將這兩個字段設置爲可選。 – Basti
好的,謝謝,我更喜歡尋找另一種解決方案,我不希望我的領域是可選的。 – rom