Django Simple Captcha无法获得ValidationError异常

时间:2013-04-22 07:57:50

标签: django django-forms captcha

如何获得它?

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"])语句,在'clean'函数中,但似乎它甚至没有进入clean。而且它也是唯一引发ValidationError的地方。

2 个答案:

答案 0 :(得分:2)

您没有在表单上调用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']

答案 1 :(得分:1)

您应该使用forms.ValidationError

Have a look at the official documentation