2016-03-22 18 views
1

Bir iletişim formu (bu nedenle model tabanlı bir form kullanmıyor) oluşturuyorum ve e-posta alanma bir regex doğrulayıcı ekledikten sonra, aşağıdaki sorunla karşılaşıyorum: eklediğim özel hata mesajı şimdi iki kez görüntüleniyor. Bu, 'bir şey' gibi bir e-posta girdiğimde (normal ifadeyle eşleşmiyor veya varsayılan '@' sembolüne sahip olduğumda olur - '@' sembolünü eklerseniz, yalnızca bir mesaj görünür).Django - geçerlilik denetleyicileri kullanırken iki kez gösteren hata iletisi

Emin değilim, ama django'nun varsayılan doğrulamasını tahmin ediyorum + benim özel onayım bundan sorumludur, bu yüzden merak ediyorum (eğer sorun buysa), aynı iletinin gösterilmesini engellemek için ne yapabilirim? iki kere yukarı

Teşekkürler!

forms.py: 'Bu benim e-posta hata msg' O

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) 

defalarca gösterilmesini biridir »örn: * Bu benim e-posta hata msg * Bu benim e-posta hata msg

olduğu

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) 

şablonu:

<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

Olası kopyalar (http://stackoverflow.com/questions/3217682/checking-validity-of-email-in-django-python) – Sayse

+0

kullanmayın Neden yerleşik [EmailValidator] (https://docs.djangoproject.com/en/1.9/ref/validators/#emailvalidator)? – Sayse

+0

Gönderdiğiniz konuya bakıyorum ama yinelenen doğrulama mesajları, yalnızca farklı doğrulama yöntemleri hakkında sözler bulamıyorum: S Regexvalidator ve emailvalidator arasındaki farklara bakacağım, ama bence sorun regex validasyonum başarısız olduğunda (yani, bir eşleşme yok) ve '@' sembolünü eklemediğimde bu çifte hata mesajını aldığım için hala orada olacağım, bu yüzden sadece iki tane tekleme olduğunu düşünüyorum. Bu olduğunda bir mesaj istiyorum. – Acla

cevap

1

EmailField ile bir RegexValidator kullandığınızda, Django, ilk olarak validate_email validator yerleşik, daha sonra doğrulayıcı ile giriş, iki kez denetler. İkinci doğrulayıcı, ilk bir hata ortaya çıkarsa bile çalışır, bu nedenle birden fazla hata mesajıyla sonuçlanabilir.

Bir seçenek doğrulama işlemini clean_email yönteminde yapmak olacaktır. clean_email yöntemi, yalnızca e-posta alanının doğrulayıcıdan herhangi bir hata yoksa çalışır.

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 

Diğer bir seçenek EmailField alt sınıfı, ve doğrulayıcı ile Django'nın eposta doğrulayıcı değiştirmek şeklinde olur. Bu durumda, Django'nun e-posta validatorunun çalışmayacağını unutmayın, bu nedenle regex'inizin geçersiz e-postalara izin vermediğinden emin olmanız size kalmış.

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

class ContactForm(forms.Form): 
    email = MyEmailField(error_messages={'invalid': 'This is my email error msg.'})) 
[Django/Python e-posta geçerliliğini kontrol etme] arasında
+0

Açıklama ve örnekler için çok teşekkür ederim! İlkini denedim ve tekrarlanan hata mesajları aldım! :) – Acla