【问题标题】:Django - forms error message showing twice when using validatorsDjango - 使用验证器时表单错误消息显示两次
【发布时间】:2016-03-23 01:16:39
【问题描述】:

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

我不确定,但我猜 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)

“这是我的电子邮件错误消息”是重复出现的那个 » 例如:* 这是我的电子邮件错误消息 * 这是我的电子邮件错误消息

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>

【问题讨论】:

  • 为什么不使用内置的EmailValidator
  • 我正在查看您发布的主题,但我找不到有关重复验证消息的提及,只有不同的验证方法:S 我要看看 regexvalidator 和 emailvalidator 之间的区别,但我认为问题仍然存在,因为当我的正则表达式验证失败(即不匹配)并且我不添加“@”符号时,我会收到此双重错误消息,所以我相信有两个验证开始,但发生这种情况时我只想要一条消息。

标签: django python-2.7


【解决方案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.'}))

【讨论】:

  • 非常感谢您的解释和示例!我已经尝试了第一个,但没有收到重复的错误消息! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2018-05-30
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多