【问题标题】:Django admin: Unique email verification fails against selfDjango admin:唯一的电子邮件验证对自己失败
【发布时间】:2012-07-30 05:26:25
【问题描述】:

嗨,这是我的 admin.py 中的一个 sn-p

#admin.py
class UserForm(forms.ModelForm):
    class Meta:
        model = User

    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError("This email already used")
        return email

class UserAdmin(admin.ModelAdmin):
    form = UserForm

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

我使用它来检查是否无法使用已使用的电子邮件地址创建新用户。问题是,当我编辑现有用户时,验证检查失败,因为有一个用户使用该邮件地址,但没关系,因为它是我正在编辑的那个。

如何告诉表单验证忽略与当前用户的匹配?

【问题讨论】:

  • 可能是干净的方法,您可以检查实例 id(我不确定该方法是否可用)。
  • 两个问题(与解决方案本身无关): 1. 为什么需要注销(或者是否需要)?和 2. 在这里进行检查而不是在模型中的电子邮件字段中添加 unique=True 是否有优势? (或者也许“与此解决方案相比,使用 unique=True 有缺点吗?”因为这就是我一直在做的事情。)

标签: django validation django-forms django-admin


【解决方案1】:

从您的查询中排除当前实例:

def clean_email(self):
    email = self.cleaned_data['email']
    if User.objects.filter(email=email).exclude(pk=self.instance.pk).exists():
        raise forms.ValidationError("This email already used")
    return email

【讨论】:

    【解决方案2】:

    在模型字段上使用unique 验证唯一性会更好。

    您可以使用具有唯一电子邮件约束的自定义 User 模型。

    查看此内容以了解有关自行实施唯一验证的更多信息https://stackoverflow.com/a/1560617/527064

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 2021-08-22
      • 2021-12-28
      • 2015-06-15
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多