将 ValidationError 提升为字典时出错

Posted

技术标签:

【中文标题】将 ValidationError 提升为字典时出错【英文标题】:Error on raising ValidationError as dictionary 【发布时间】:2015-08-15 00:48:43 【问题描述】:

这里是 Django 新手。我试图在我的自定义表单中为电子邮件字段引发错误。我的 forms.py 有以下代码来验证电子邮件:

def clean_email(self):
    email = self.cleaned_data["email"]
        try:
            User._default_manager.get(email=email)
                except User.DoesNotExist:
                return email
        raise ValueError('email':'Email already registered. 
                     Login to continue or use another email.')

再次输入现有电子邮件时,我在应用程序的调试屏幕上收到以下错误:

我在这里做错了什么?我正在关注这个LINK

编辑 将 ValueError 更改为 ValidationError 时出现此错误 当 error 参数包含多个字段的错误时,参数 field 必须为 None

【问题讨论】:

你为什么要传递一个字典? @PadraicCunningham 我正在传递一个 dict 以引发电子邮件错误。 如果您想显示电子邮件,您不能使用字符串并使用 str.format 传递电子邮件吗? "Email: already registered. Login to continue or use another email".format(email) @PadraicCunningham 不确定要更改什么。你能详细说明一下吗? 使用ValidationError("Email: already registered. Login to continue or use another email".format(email)) 【参考方案1】:

使用raise ValidationError 代替raise ValueError

def clean(self):
    email = self.cleaned_data["email"]
    try:
        User._default_manager.get(email=email)
    except User.DoesNotExist:
        return self.cleaned_data
    raise ValidationError('email':'Email already registered. Login to continue or use another email.')

【讨论】:

现在出现此错误:The argument field must be None when the error` 参数包含多个字段的错误。` 您应该将字符串而不是字典传递给异常。我已经提供了示例。 这就是问题所在。我想专门针对电子邮件(field_error)而不是一般错误(non_field_error)提出错误 在这种情况下,我认为您应该将 clean_email 重命名为 clean。 如果您使用 clean_,请不要指定字典。引发的任何 ValidationError 都会自动与该字段相关联。【参考方案2】:

你不应该提出 ValueError,你应该提出 forms.ValidationError

【讨论】:

是的,很抱歉。它的验证错误。立即查看错误。【参考方案3】:

使用clean_<fieldname> 时,不要指定字典。在该方法中引发的任何 ValidationError 都会自动与该字段关联。

def clean_email(self):
    email = self.cleaned_data["email"]
    try:
        User._default_manager.get(email=email)
    except User.DoesNotExist:
        return email
    raise ValidationError('Email already registered. 
                 Login to continue or use another email.')

【讨论】:

以上是关于将 ValidationError 提升为字典时出错的主要内容,如果未能解决你的问题,请参考以下文章

Django提升表单ValidationError不起作用

Mandrill ValidationError

Mongoose ValidationError:验证失败:需要路径

在引发 ValidationError 期间“未定义全局名称'_'”

Python - 将字典列表附加到嵌套的默认字典时出现关键错误

ValidationError:转换为 [undefined] 失败