ここは私の状況です。私はユーザーが自分のアカウントを作成するためのWebページを持っています。このページには、ボットを防ぐためのreCaptchaがあります。ユーザーが "Submit"をクリックすると、対応するフォームを作成する前に、対応するビューにreCaptcha検証が実行されます。ユーザーの入力がreCaptchaの検証に失敗したとしましょう。このエラーをユーザーにどのように戻す必要がありますか?フォームの「non_field_errors」にエラーを追加する必要がありますか?もしそうなら、これを行う正しい方法は何ですか?ビューからフォームの「non_field_errors」にエラーを追加する方法は?
私の現在のアプローチは、reCaptchaエラーを含むエラーのリストをビューからフォームコンストラクタに渡し、()のフォームの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)
なぜcaptchaを持っていないのでしょうか?これらの[フィールド/ウィジェットクラス](https://github.com/mozilla/django-recaptcha)のようなものを使うことができます。 –
@ lazerscience - より良い方向を指摘してくれてありがとう。 :) – tamakisquare