【问题标题】:Using default popups to show Django Forms errors使用默认弹出窗口显示 Django Forms 错误
【发布时间】:2015-04-12 08:07:14
【问题描述】:

当使用 Django Forms 定义表单时,如果我有一个 EmailField,我会得到一些整洁的弹出窗口,就像我在图片中显示的那样:

但如果我引入自定义验证,我无法以同样的方式(通过弹出窗口)向用户显示错误

这是我的forms.py:

from django import forms
from launcher.models import InterestedUser
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator

class JoinForm(forms.ModelForm):
# this is the only field that is actually filled by the user
    email = forms.EmailField(max_length=128, help_text="Introduce la cuenta de gmail que tienes asociada a tu"
                                                   "dispositivo Android",
                         widget=forms.EmailInput(attrs={'class': "w-input email_input",
                                                        'placeholder': 'Tu email de Google'}),
                         required=True, validators=[RegexValidator(regex='^([a-zA-Z0-9_\.\-])+\@(gmail.com)+$',
                                                                   message="La dirección de email no es válida",
                                                                   code="invalid_gmail_address")])
print("atributos {0}".format(email.widget.attrs['class']))

# this other fields will have the same value and go hidden in the form
name = forms.CharField(widget=forms.HiddenInput(), initial="(not specified)")
subject = forms.CharField(widget=forms.HiddenInput(), initial="(no subject)")
via = forms.CharField(widget=forms.HiddenInput(), initial="Join")
content = forms.CharField(widget=forms.HiddenInput(), initial="no content")

def clean_email(self):
    email = self.cleaned_data.get('email')

    try:
        beta_tester = InterestedUser.objects.get(email=email)
    # Si el email no existiese entonces salimos del clean_email y devolvemos el valor (aunque no se haya modificado)
    except InterestedUser.DoesNotExist:
        return email
    # Si el email ya existía sacamos un error de Validación:
    raise forms.ValidationError("Ya estabas anotado como Beta Tester, introduce un email diferente!")


class Meta:
    model = InterestedUser
    fields = ('email', 'name', 'subject', 'via', 'content',)

这就是我在模板中呈现它的方式:

            <div class="w-form formulario" id="formulario">
                <form class="w-clearfix formulario_subscribe" name="email-form" id="join_form" method="post" data-name="Email Form" action="/">
                    {% csrf_token %}
                    {% for hidden in form.hidden_fields %}
                        {{  hidden }}
                    {% endfor %}
                    {% for field in form.visible_fields %}
                        {{ field.errors }}
                        {{ field.help_text }}
                        {{ field }}
                    {% endfor %}
                    <input class="w-button email_submit_button" type="submit" id="btn_send" value="Join" data-wait="Un momento!..."/>
                    {% if messages %}
                        <ul class="messages">
                            {% for message in messages %}
                                <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
                            {% endfor %}
                        </ul>
                    {% endif %}
                </form>
            </div>

我有一个 RegexValidator,如果用户输入没有以与默认验证器相同的方式(弹出窗口)通过验证器,我想显示错误消息!有什么想法吗??

非常感谢。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    我认为这个弹出窗口是由浏览器验证 HTML5 电子邮件字段(看起来像 chrome)创建的,您可以禁用此验证,将 novalidate 属性添加到表单字段。或者更有趣的是,您可以使用 pattern 检查 gmail.com 地址,例如:

    <input type="email" pattern="/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@gmail.com$" />
    

    如果您想在客户端进行验证,您可以使用 parsley 之类的东西

    您也可以检查EmailValidator,而不是使用正则表达式验证电子邮件。有一个属性 domain_whitelist 可用于限制 gmail.com 域。

    【讨论】:

    • 是的,第一张图是Chrome,第二张是Firefox!明天我会尝试你给我的建议,并检查答案是否正确,一切顺利!非常感谢。
    • 完美。祝chattyhive好运! ;)
    • :非常感谢(jaja no me daba cuenta de quién eras!)
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多