如何获得它?
在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的地方。
答案 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