2016-03-22 11 views
1

Ich erstelle ein Kontaktformular (daher kein modellbasiertes Formular) und bin nach dem Hinzufügen eines Regex-Validators zu meinem E-Mail-Feld auf folgendes Problem gestoßen: Die benutzerdefinierte Fehlermeldung, die ich hinzugefügt habe, wird jetzt zweimal angezeigt. Das passiert, wenn ich eine E-Mail wie "etwas" eintrage (sie stimmt nicht mit meiner Regex überein oder hat das Standardzeichen "@" - wenn ich das '@' Symbol anschließe, erscheint nur eine Nachricht).Django - Formularfehlermeldung, die bei Verwendung von Validatoren zweimal angezeigt wird

Ich bin mir nicht sicher, aber ich denke, Djangos Standardvalidierung + meine benutzerdefinierte Validierung sind dafür verantwortlich, also frage ich mich (wenn das das Problem ist), was ich tun kann, um die gleiche Nachricht zu verhindern zweimal hoch.

Vielen Dank im Voraus!

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) 

Das ‚Das ist mein E-Mail-Fehler msg ist‘ die man immer wieder zeigt sich »zum Beispiel: * Das ist meine E-Mail-Fehler msg * Dies ist meine E-Mail-Fehler 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) 

Vorlage:

<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

Mögliches Duplikat von [E-Mail in django/Python Prüfung der Gültigkeit] (http://stackoverflow.com/questions/3217682/checking-validity-of-email-in-django-python) – Sayse

+0

Warum nicht verwenden der eingebaute [EmailValidator] (https://docs.djangoproject.com/en/1.9/ref/validators/#emailvalidator)? – Sayse

+0

Ich schaue mir das Thema an, das du gepostet hast, aber ich finde keine Erwähnungen über wiederholte Validierungsnachrichten, nur verschiedene Validierungsmethoden: S Ich werde mir die Unterschiede zwischen regexvalidator und emailvalidator ansehen, aber ich denke das Problem wird immer noch da sein, weil ich diese doppelte Fehlermeldung bekomme, wenn meine Regex-Validierung fehlschlägt (das heißt, es gibt keine Übereinstimmung) und wenn ich das '@' Symbol nicht hinzufüge, so glaube ich, dass es zwei Validierungen gibt, aber nur ich möchte eine Nachricht, wenn dies passiert. – Acla

Antwort

1

Wenn Sie eine RegexValidator mit einer EmailField verwenden, überprüft Django die Eingabe zweimal, zuerst mit dem eingebauten Validator validate_email, dann mit Ihrem Validator. Der zweite Validator wird ausgeführt, auch wenn der erste einen Fehler auslöst. Daher können mehrere Fehlermeldungen auftreten.

Eine Option wäre, Ihre Validierung in der clean_email Methode durchzuführen. Die Methode clean_email wird nur ausgeführt, wenn der Validierer des E-Mail-Felds keine Fehler enthält.

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 

wäre eine weitere Option sein EmailField, Unterklasse und Django die E-Mail-Validator mit Ihrem Validator ersetzen. Beachten Sie, dass in diesem Fall der E-Mail-Validierer von Django nicht ausgeführt wird. Es liegt also an Ihnen, sicherzustellen, dass Ihre Regex keine ungültigen E-Mails zulässt.

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

class ContactForm(forms.Form): 
    email = MyEmailField(error_messages={'invalid': 'This is my email error msg.'})) 
+0

Vielen Dank für die Erklärung und Beispiele! Ich habe die erste ausprobiert und ich habe keine wiederholten Fehlermeldungen erhalten! :) – Acla

Verwandte Themen