2016-03-22 39 views
1

我正在創建聯繫表單(因此不使用基於模型的表單),並且在將正則表達式驗證程序添加到我的電子郵件字段後遇到以下問題:我添加的自定義錯誤消息現在顯示兩次。 發生這種情況時,我輸入一個電子郵件,如'東西'(它不符合我的正則表達式,也沒有默認的'@'符號 - 如果我添加'@'符號,只有一個消息顯示)。Django - 在使用驗證器時顯示兩次表單錯誤消息

我不確定,但我猜django的默認驗證+我的自定義驗證是負責,所以我想知道(如果這是問題),我可以做什麼,以防止顯示相同的消息兩次。

預先感謝您!

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) 

「這是我的電子郵件錯誤味精」是反覆地出現,一個»如:*這是我的電子郵件錯誤味精*這是我的電子郵件錯誤味精

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

[檢查在Django/Python的電子郵件的有效性]的可能的複製(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之間的區別,但我認爲問題仍然會在那裏,因爲當我的正則表達式驗證失敗(即沒有匹配),並且當我不添加'@'符號時,我得到這個雙重錯誤信息,所以我相信有兩個驗證正在踢入,但我只當發生這種情況時想要一條消息 – Acla

回答

1

當您將RegexValidatorEmailField一起使用時,Django會檢查輸入兩次,首先檢查內置的validate_email驗證程序,然後檢查驗證程序。即使第一個驗證器發生錯誤,第二個驗證器也會運行,因此最終可能會出現多個錯誤消息。

一種選擇是在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.'})) 
+0

非常感謝你的解釋和例子!我嘗試了第一個,但沒有重複的錯誤信息! :) – Acla

相關問題