場景:我正在構建訂單表單。像地球上的其他訂單一樣,它具有單獨的發票寄送地址。我剛剛添加了「使用帳單地址」複選框,以讓用戶節省時間。如果設置了BooleanField,則只驗證某些字段
問題是,運輸領域仍然存在。如果用戶沒有輸入任何送貨地址數據(如他們想使用賬單地址),他們將失敗驗證。
我覺得我想要做的覆蓋爲這些重複字段的ModelForm驗證。在那裏,如果該框被選中(不知道如何從驗證器中獲取數據),我會返回結算版本。如果沒有選中,我會將其傳回原始驗證。
聽起來像一個計劃不是嗎?好吧,我摔倒在第一個障礙。我的clean_functions
不起作用。看起來不像他們甚至被稱爲。
下面是一些代碼:
# shipping_street is a field in my Order Model
class OrderForm(ModelForm):
class Meta:
model = Order
def clean_shipping_street(self):
print "JUST GET ME SOME OUTPUT!!!"
raise forms.ValidationError('RAWRAWR')
這裏是我是如何測試:
def checkout(request):
of = OrderForm()
if request.method == "POST":
of = OrderForm(request.POST)
print 'Form valid:', of.is_valid()
# ...
# return my HttpResponse with 'of' in the context.
這是我會這樣做的方式。也許不是最好的,但定製的清潔方法可能是最簡單的。 – 2009-11-28 04:28:58
請注意,'clean_'方法沒有以任何特定的順序調用,所以在上面的'ship_to_billing'中可能沒有設置''cleaned_data'。一般情況下,如果你的清潔方法依賴於表單中的多個項目,請使用普通的'clean'方法。 –
2009-11-28 16:51:30
我對尼姆有個想法。而不是調用'self.cleaned_data ['field_name']',稱爲'self.clean_field_name()' - 這樣就保證了結果(除非您的自定義清除具有混亂的循環依賴)。這對於CPU來說有點多,但它應該始終有效。 – Oli 2009-11-29 01:47:28