2016-03-22 2 views
1

コンタクトフォームを作成しているため(モデルベースのフォームを使用していない)、電子メールフィールドに正規表現バリデーターを追加した後、私が追加したカスタムエラーメッセージが2度表示されています。 これは、「何か」などの電子メールを入力すると発生します(正規表現と一致しない、デフォルトの「@」記号 - 「@」記号を追加すると1つのメッセージしか表示されません)。バリエーターを使用するとDjango - フォームエラーメッセージが2回表示される

私は確信していませんが、私はdjangoのデフォルトの検証+私のカスタム検証がそれを担当していると思いますので、私は(それが問題ならば)疑問に思っています。 2回アップ。

ありがとうございます!

forms.py:

from django import forms 
from django.core.validators import RegexValidator 

class ContactForm(forms.Form): 
    full_name = forms.CharField(required=True) 
    email = forms.EmailField(validators=[RegexValidator(regex=r'^\[email protected]([[email protected]_]+)(\.[[email protected]_]+)+\b')] 
          , error_messages={'invalid': 'This is my email error msg.'}) 
    message = forms.CharField(widget=forms.Textarea) 

「これは私の電子メールのエラーMSGがされた」»例えば繰り返し現れて一つであること:*これは私の電子メールのエラーMSGである*これは私の電子メールのエラーMSG

です

views.py:

def contact(request): 
    form = ContactForm(request.POST or None) 
    context = {"form":form} 

    if form.is_valid(): 
     form_name = form.cleaned_data.get("full_name") 
     form_email = form.cleaned_data.get("email") 
     form_message = form.cleaned_data.get("message") 
     subject = "Message from %s (%s)" % (form_name, form_email) 
     from_email = form_email 
     to_email = ['myemail',] 
     contact_message = form_message 
     send_mail(subject, contact_message, from_email, to_email, fail_silently=False) 
     context = {"form":form,"thanks_msg": "Thank you!"} 

    return render(request, 'contact.html', context) 

テンプレート:

<form action="" method="POST" class="form"> {% csrf_token %} 
      {% for field in form %} 
      <div class="fields-container"> 
       <label class="label">{{ field.label }}</label> 
       {{ field }} 
      </div> 
      <p class="server-form-errors"> {{ field.errors.as_text }} </p> 
      {% endfor %} 
      <button type="submit" id="form-button">Submit</button> 
     </form> 
+0

可能な複製(http://stackoverflow.com/questions/3217682/checking-validity-of-email-in-django-python) – Sayse

+0

使用しない理由組み込みの[EmailValidator](https://docs.djangoproject.com/en/1.9/ref/validators/#emailvalidator)? – Sayse

+0

私はあなたが投稿したトピックを見ていますが、私は繰り返し検証メッセージについての唯一の異なる検証方法については言及が見つかりません:S regexvalidatorとemailvalidatorの違いを見ていきますが、正規表現の検証が失敗したとき(つまりマッチしないとき)、 '@'記号を追加しないときにこの2つのエラーメッセージが表示されるので、そこにはまだ存在します。したがって、2つのバリデーションが実行されますが、これが起こると、1つのメッセージが必要です。 – Acla

答えて

1

EmailFieldを使用すると、Djangoはまずvalidate_emailバリデーターを組み込み、次にバリデーターを使用して入力を2回チェックします。最初のバリデータがエラーを発生させたとしても、2番目のバリデータは実行されるため、複数のエラーメッセージが表示される可能性があります。

1つの方法は、clean_emailメソッドで検証することです。 clean_emailメソッドは、電子メールフィールドのバリデータからのエラーがない場合にのみ実行されます。

class ContactForm(forms.Form): 
    full_name = forms.CharField(required=True) 
    email = forms.EmailField(error_messages={'invalid': 'This is my email error msg.'}) 
    ... 

    def clean_email(self): 
     email = self.cleaned_data['email'] 
     validator = RegexValidator('...') 
     validator(email) 
     return email 

別のオプションはEmailFieldをサブクラス化し、あなたのバリデータで、Djangoの電子メールのバリデータを置き換えることであろう。この場合、Djangoの電子メールバリデーターは実行されないので、あなたの正規表現が無効な電子メールを許可しないことを確認することはあなた次第です。

class MyEmailField(EmailField): 
    default_validators = [RegexValidator(regex=r'...')] 

class ContactForm(forms.Form): 
    email = MyEmailField(error_messages={'invalid': 'This is my email error msg.'})) 
[ジャンゴ/ Pythonでメールの妥当性を確認する]の
+0

説明と例をありがとうございました!私は最初のものを試しました、そして、私は繰り返しエラーメッセージを持っていません! :) – Acla

関連する問題