2010-07-23 78 views
0

我想要做的就是添加一個錯誤的字段在視圖中,既form.is_valid()form.save()後,它似乎工作,但只是一個黑客,因爲,我希望這裏有人能解釋爲什麼它作品。在視圖中添加一個Django窗體的錯誤...破解?

所以在我的窗體的save()功能,我連接到LDAP服務器,並嘗試在形式提供的用戶名和密碼進行身份驗證。如果一切正常,最終發生的是User對象,並創建一個Profile對象。但是,在用於連接LDAP並從中獲取數據的代碼中,可能會發生錯誤,例如憑據錯誤或無法綁定到服務器。在這種情況下,我返回None,然後我的觀點通過向表單添加錯誤來處理它。下面是該視圖中的相關代碼:

if form.is_valid(): 
    profile = form.save() 
    if profile is None: 
     # there was an LDAP error 
     msg = u"An error ocurred trying to authenticate over LDAP. Try again." 
     form = form_class(request.POST) 
     print form 
     form._errors['user_name'] = ErrorList([msg]) 

     return render_to_response(template_name, locals()) 

現在,註釋掉打印語句,我得到了'NoneType' object does not support item assignment當我嘗試錯誤添加到窗體。如果我取消打印聲明的註釋,它就像我期望的那樣工作。任何想法爲什麼?無論如何,我可以做到這一點,而沒有在那裏的打印聲明?謝謝!

PS:我不想做表單驗證的清潔方法,因爲我不希望有綁定到LDAP服務器,並嘗試兩次驗證用戶身份,我只是希望它一旦發生,且無論是工作還是沒有。

回答

3

form._errors不存在,直到驗證發生。通過調用print form,您隱式地爲您的新表單實例調用form.is_valid()

這就提出了一個問題,你爲什麼要創建一個新的表單實例?我會註釋掉form = form_class(request.POST)行並使用您現有的表單。

+0

好問題..它晚了,我累了,整天我一直在此。這是我最好的答案:P 但是,謝謝,這效果更好。 – hora 2010-07-23 04:28:18