为什么这个Django表单没有引发ValidationError?

时间:2016-11-21 08:00:47

标签: python django forms

如果已经存在使用相同电子邮件的情况,我在注册期间尝试引发ValidationError。我在表单中添加了以下方法来执行此操作。

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

        if email:
            try:
                user = User.objects.get(email=email)
            except:
                user = None
        if user is not None:
            raise forms.ValidationError('This email address is unavailable!')

        return email

但是,我在except之后包含了一个print语句,并且控制台始终打印该值。因此,即使具有指定电子邮件地址的用户存在,也会出于某种原因执行该部分代码。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

问题在于返回功能,在try的位置,除了使用exists()方法进行代码简化:

from django.contrib.auth.models import User

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

    if email:
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('This email address is unavailable!')
        else:
            pass

    return email

并确保html代码也在表单模板中更新如下:

   {% if form.errors %}
        {% for field in form %}
            {% for error in field.errors %}
                <div class="row">
                    {{ error|escape }}
                </div>
            {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
            <div class="row">
                {{ error|escape }}
            </div>
        {% endfor %}
    {% endif %}