Django管理员:针对self的唯一电子邮件验证失败
嗨,这是我的admin.py的一个片段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
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是否有缺点?”因为我一直在这么做。)