2011-07-16 12 views
0

ここは私の状況です。私はユーザーが自分のアカウントを作成するための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) 
+1

なぜcaptchaを持っていないのでしょうか?これらの[フィールド/ウィジェットクラス](https://github.com/mozilla/django-recaptcha)のようなものを使うことができます。 –

+0

@ lazerscience - より良い方向を指摘してくれてありがとう。 :) – tamakisquare

答えて

0

まず、私が指しているため@lazerscienceに感謝したいと思います私の問題を解決するためのより良い方向を出してください。しかし、私はdjango-recaptchaアプリを提案していませんでした。

私は、Marco Fucciのcode snippetを使用して終了しました。簡単な要約では、このコードスニペットは、ReCaptcha用のカスタムフォームフィールド(およびウィジェット)を作成するのに役立ちます。これが完了したら、フォームにReCaptchaを持たせるために必要なのは、フォーム定義に1行追加するだけです。

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 
+0

ありがとうクレイグ。しかし、コードの再利用性が向上したため、@ lazerscienceが提案するアプローチを採用することに決めました。 – tamakisquare

関連する問題