2010-11-24 51 views
1

我有一個django窗體,首先通過調用form.is_valid()驗證其數據。如果沒有,則重新顯示錶單,並顯示有關無效數據的錯誤消息。 現在,如果is_valid()爲true,我嘗試將數據保存在ldap後端。如果form.cleaned_data與ldap數據類型不匹配,我會從我的ldap保存方法中獲得一個Exception。現在我想在這種情況下做的是重新顯示帶有錯誤信息的表單,就像在form.is_valid()返回false之後發生的事情一樣。 我試着閱讀一些文檔和一些Django源文件,但無法找到我可以在哪裏插入。重新顯示django窗體成功調用is_valid()後自定義錯誤消息

另一種方法是仔細構建(自定義)表單字段的形式,以「保證」數據已準備好符合ldap語法。 但我想讓shure知道我捕獲了ldap語法錯誤並以便捷的形式顯示它們。所以,如果我能夠鉤入這種形式的重新顯示機制會讓我成爲一個快樂的小程序員:-)

任何想法或提示?

回答

2

在你的類擴展forms.Form的形式,添加下列方法之一,假設你有一個is_valid_ldap_data()某處定義:

整整形式:

def clean(self): 
    if !is_valid_ldap_data(self.cleaned_data.get("fieldname")): 
     raise forms.ValidationError("Invalid LDAP data type"); 
    return self.cleaned_data 

或單個字段:

def clean_fieldname(self): 
    if !is_valid_ldap_data(self.cleaned_data['fieldname'])): 
     raise forms.ValidationError("Invalid LDAP data type"); 
    return self.cleaned_data['fieldname'] 
1

在表單子類中實現自定義字段驗證方法

http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

驗證邏輯必須屬於它的地方。如果form.is_valid() == Trueform.cleaned_data必須有效。只是因爲代碼這麼說。你想在其他地方隱藏一些驗證邏輯 - 這是不好的做法。

+1

好點。這讓我重新思考我的邏輯。因爲我實際上沒有辦法通過ldap檢查ldap語法,直到我將其寫入ldap。所以我應該執行自定義檢查,或者將si_valid_and_successfully_saved()重寫爲is_valid()。 – Isaac 2010-11-25 11:58:47

0

在我看來,你只是有一個額外的驗證步驟。
,你可以根據它們是您的特定需求:

但在任何情況下,如果表單因任何原因無效(如您的情況),is_valid應返回False。

+0

我同意。看到我對petraszd答案的評論。 – Isaac 2010-11-25 11:59:35

相關問題