这是我的情况。我有一个网页供用户创建自己的帐户。在这个页面上,有一个reCaptcha来防止机器人。用户单击“提交”,在构造相应的表单之前,在相应的视图中执行reCaptcha验证。假设用户的输入未通过reCaptcha验证。我应该如何将此错误提示给用户?我应该将错误添加到表单的“non_field_errors”吗?如果是这样,这样做的正确方法是什么?
我目前的方法是将一个错误列表(包括reCaptcha错误)从视图传递到表单构造函数,并将错误添加到 init ()中表单的non_field_errors中。然而,我向表单的non_field_errors(referenced post)添加错误的方式是不够的。当传递的列表中存在多个错误时,后者总是会覆盖它之前的错误。 如何将错误附加到表单的non_field_errors而不是每次都覆盖现有错误?
views.py:
def create_account(request):
""" User sign up form """
if request.method == 'POST':
recaptcha_result = check_recaptcha(request)
if recaptcha_result.is_valid:
...
else:
non_form_errors = ['Incorrect reCaptcha word entered. Please try again.'];
signup_form = SignUpForm(request.POST, non_form_errors=non_form_errors)
else:
signup_form = SignUpForm()
public_key = settings.RECAPTCHA_PUBLIC_KEY
script = displayhtml(public_key=public_key)
return render(request, 'create_account.html',
{'signup_form': signup_form, 'script': script})
forms.py:
class SignUpForm(UserCreationForm):
""" Require email address when a user signs up """
email = forms.EmailField(label='Email address', max_length=75, widget=TextInput(attrs={'size': 30}))
def __init__(self, *args, **kwargs):
non_form_errors = []
if kwargs.has_key('non_form_errors'):
non_form_errors.append(kwargs.pop('non_form_errors'))
super(SignUpForm, self).__init__(*args, **kwargs)
for err in non_form_errors:
self.errors['__all__'] = self.error_class(err)
答案 0 :(得分:0)
在forms.py
:
def __init__(self, *args, **kwargs):
non_form_errors = []
if kwargs.has_key('non_form_errors'):
non_form_errors.append(kwargs.pop('non_form_errors'))
super(SignUpForm, self).__init__(*args, **kwargs)
errors = self.errors.get('__all__', [])
for err in non_form_errors:
errors.append(self.error_class(err))
self.errors['__all__'] = errors
答案 1 :(得分:0)
首先,我要感谢@lazerscience指出了解决问题的更好方向。但是,我没有按照建议使用 django-recaptcha 应用程序。
我最终使用了来自Marco Fucci的code snippet。在快速摘要中,此代码段可帮助您为ReCaptcha创建自定义表单字段(和窗口小部件)。一旦到位,在表单上使用ReCaptcha所需要做的就像在表单定义中添加一行一样简单。