Django管理员:针对self的唯一电子邮件验证失败

Django管理员:针对self的唯一电子邮件验证失败,django,validation,django-forms,django-admin,Django,Validation,Django Forms,Django Admin,嗨,这是我的admin.py的一个片段 #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.V

嗨,这是我的admin.py的一个片段

#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)
我使用此选项检查是否无法使用已使用的电子邮件地址创建新用户。问题是,当我编辑一个现有用户时,验证检查失败,因为有一个用户具有该邮件地址,但这没关系,因为我正在编辑该用户


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

从查询中排除当前实例:

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

在模型字段上使用
unique
验证唯一性要好得多

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


查看此处,了解有关自行实施唯一验证的更多信息

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