Django - 使用验证器时显示两次显示错误消息

时间:2016-03-22 15:55:06

标签: django python-2.7

我正在创建一个联系表单(因此不使用基于模型的表单),在我的电子邮件字段中添加了一个正则表达式验证程序后,我遇到了以下问题:我添加的自定义错误消息现在是被显示两次。 当我输入诸如“某事”之类的电子邮件时,会发生这种情况(它与我的正则表达式不匹配,也没有默认的'@'符号 - 如果我添加'@'符号,只显示一条消息)。

我不确定,但我猜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'^\d+@([a-zA-Z0-9@-_]+)(\.[a-zA-Z0-9@-_]+)+\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>

1 个答案:

答案 0 :(得分:1)

当您使用带有RegexValidator的{​​{1}}时,Django会检查输入两次,首先使用内置的EmailField验证程序,然后使用验证程序。即使第一个验证器引发错误,第二个验证器也会运行,因此您最终可能会收到多条错误消息。

一种选择是在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 ,并用您的验证器替换Django的电子邮件验证器。请注意,在这种情况下,Django的电子邮件验证程序将无法运行,因此您可以确保您的正则表达式不允许任何无效的电子邮件。

EmailField