2017-12-05 15 views
0

clean()メソッドを上書きしてフォームのカスタムバリデーターを作成しようとしていますが、何らかの理由で検証エラーが正しく発生しません。ここに私のコードは次のとおりです。ValidationErrorが発生したときにDjangoフォームのclean()メソッドでエラーが発生しない

forms.py

from django import forms 
from django.contrib.auth import get_user_model 

class EmailForm(forms.Form): 
    email_field = forms.EmailField(label='E-mail address', max_length=128) 

    def clean(self): 
     cleaned_data = super(EmailForm, self).clean() 
     email = cleaned_data.get('email') 

     try: 
      u = get_user_model().objects.get(email=email) 
      raise forms.ValidationError("E-mail already in database.") 
      print('validation error raised') 
     except: 
      pass 

views.py

from django.shortcuts import render 
from django.contrib import messages 

from .forms import EmailForm 

def email_form(request): 
    if request.method == 'POST': 
     form = EmailForm(request.POST) 

     # If the form is valid... 
     if form.is_valid(): 
      messages.add_message(request, messages.SUCCESS, "Kaboom! Your referral e-mail was sent. Hang tight - we'll be sure to let you know when your friend makes a purchase.") 
     else: 
      messages.add_message(request, messages.ERROR, 'Error!') 
    else: 
     form = EmailForm() 

    return render(request, 'template.html', {'form': form}) 

template.html

<form action="{% url 'form-process' %}" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

このフォームを入力して、検証エラー(つまり、自分のデータベースのユーザーに既に関連付けられている電子メールアドレス)を入力する必要がある場合は、エラーではなく「成功」メッセージが表示されます。私のコンソールには、「検証エラーが発生しました」というメッセージが印刷されていますが、なんらかの理由でフォームプロセスとform.is_valid()がTrueとして渡されます。

重複した電子メールが入力された場合、form.is_validが以下のコードでエラーを出力しない理由を誰にでも教えてください。

+0

この句は何と考えていますか? 'except:Pass' –

+0

この句は、電子メールアドレスがデータベースのユーザとまだ関連付けられていない場合にのみトリガする必要があります。すでにデータベースにある電子メールアドレスを入力すると、「試行」ブロックに残り、検証エラーが発生するはずです。 – Sam

+0

'try'ブロックで発生したすべての例外は、明示的に' raise'dを含む例外に一致する 'except'節によって捕捉されます。これは 'try/except'の要点のようなものです。 –

答えて

1

例外を発生させることはできません。

def clean(self): 
    cleaned_data = super(EmailForm, self).clean() 
    email = cleaned_data.get('email') 

    users = get_user_model().objects.filter(email=email) 
    if users.count(): 
     raise forms.ValidationError("E-mail already in database.") 
+1

'users.exists():'がほんの少し上の場合。 –

+0

これは魅力のように機能します。ありがとうございました! – Sam

関連する問題