2013-04-22 104 views
0

如何獲取它?Django Simple Captcha無法獲得ValidationError異常

this教程,它說,if the user didn’t provide a valid response to the CAPTCHA challenge, the form will raise a ValidationError:

我的形式

class AuthenticationForm(forms.Form): 
    username = forms.CharField(label=_("Username"), max_length=30) 
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 
    captcha = CaptchaField(label=_("Captcha")) 

我看來

try: 
    form = AuthenticationForm(request.POST) 
    if form.is_valid(): 
     pass 
except Exception, ex: 
    LOG.debug("Captcha Error: %s" % str(ex)) 

我無法從形式的任何異常。如何完成它?有任何想法嗎?

UPDATE1

我把一些subprocess.call(["logger", "-t", "blah", "blahblah"])聲明Captcha驗證碼的源代碼,在「清潔」功能,但似乎它甚至沒有進入clean。而且它也是唯一引發ValidationError的地方。

回答

1

您應該使用forms.ValidationError

Have a look at the official documentation

+0

我嘗試過,但沒有運氣。另外,「異常」本身並不意味着可能引發的所有異常? – mtndesign 2013-04-22 08:23:56

+0

添加您的整個視圖 – 2013-04-22 12:20:11

+0

其實,我的觀點僅由我發佈的代碼+'如果request.POST'有條件block.s這一切;) – mtndesign 2013-04-25 13:33:05

1

你是不是調用形式is_valid(),除非你做任何驗證錯誤將得到提升。

我猜你想要的東西,如:

try: 
    form = AuthenticationForm(request.POST) 
    if form.is_valid(): 
     #Do something 
except Exception, ex: 
    #ValidationErrror will be caught here 
    LOG.debug("Captcha Error: %s" % str(ex)) 

但你仍然不會得到任何的異常。原因:當您撥打is_valid時,django內部使用名爲full_clean的方法。如果任何字段引發ValidationError,則在內部,此方法捕獲它並更新表單上名爲errors的屬性。因此,您的視圖將永遠不會獲得由表單字段引發的任何ValidationError

知道ValidationError是否被引發的方法是訪問表單的errors屬性。

因此,對於該代碼將

form = AuthenticationForm(request.POST) 
if form.is_valid(): 
    pass 
#In case of valid form next line will not be called because form.errors will be an empty dict 
if form.errors and 'captcha' in form.errors: 
    LOG.debug("Captcha Error:") 
    #also you can access exact error by form.errors['captcha'] 
+0

我想這些,但不能把它工作。我也使用forms.ValidationError,但再次無法正常工作。 – mtndesign 2013-04-25 13:37:03

+0

我更新了這個問題;) – mtndesign 2013-04-25 13:39:24

+0

你在調用'is_valid()'? – 2013-04-25 17:33:38