如何获取?
在 this教程中,它说如果用户没有对 CAPTCHA 质询提供有效响应,表单将引发 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
我在验证码的源代码中的“clean”函数中放置了一些 subprocess.call(["logger", "-t", "blah", "blahblah"])
语句,但是看起来它甚至没有进入clean
。这也是唯一引发 ValidationError 的地方。
最佳答案
您没有在表单上调用 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
的属性。因此,您的 View 永远不会收到表单字段引发的任何 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']
关于Django简单验证码无法获取ValidationError异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142073/