1

如何得到它?

教程中,它说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))

我无法从表格中得到任何例外。如何实现它?有任何想法吗?

更新1

subprocess.call(["logger", "-t", "blah", "blahblah"])在验证码的源代码中添加了一些语句,在 'clean' 函数中,但似乎它甚至没有进入clean. 而且它也是唯一引发 ValidationError 的地方。

4

2 回答 2

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引发 a 的方法是访问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']
于 2013-04-22T10:04:14.670 回答
1

你应该使用forms.ValidationError

看看官方文档

于 2013-04-22T08:03:44.160 回答