【问题标题】:Why is this Django form not raising ValidationError?为什么这个 Django 表单没有引发 ValidationError?
【发布时间】:2017-04-04 13:28:39
【问题描述】:

如果已存在使用相同电子邮件的情况,我将尝试在注册期间引发 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 之后包含了一个打印语句,并且控制台总是打印该值。因此,即使具有指定电子邮件地址的用户存在,也出于某种原因执行该部分代码。

我做错了什么?

【问题讨论】:

  • return email 错误内容...
  • 我不明白。对不起。
  • @MiniGunnR 您是否按照我的建议导入了用户模型..??

标签: python django forms


【解决方案1】:

问题在于 return 函数,在 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 %}

【讨论】:

  • 我收到了'str' object has no attribute 'objects'。此行突出显示if User.objects.filter(email=email).exists():
  • @MiniGunnR 您是否将用户模型导入到 forms.py 文件中?如果没有,则导入用户模型。
  • @MiniGunnR 你已经用字符串覆盖了User
  • 嘿伙计。谢谢。我现在已经导入了 User 模型。它有效!
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 2013-02-02
  • 2018-12-27
  • 1970-01-01
  • 2016-11-28
  • 2010-09-25
  • 2016-09-16
  • 2017-09-30
相关资源
最近更新 更多