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

Min*_*nnR 1 python forms django

我正在尝试在注册期间引发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
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

Pra*_*edi 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
Run Code Online (Sandbox Code Playgroud)

并确保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 %}
Run Code Online (Sandbox Code Playgroud)

  • @MiniGunnR你用字符串覆盖`User`. (3认同)