Django 在继承自 UserAdmin 时显示用户表单验证错误消息



我正在使用带有配置文件的 django 用户模型来扩展具有更多属性的用户。我需要确保用户表中用户之间的电子邮件 ID 唯一。

from django.contrib.auth.forms import UserCreationForm, UserChangeForm 
from django.contrib.auth.admin import UserAdmin
class UserForm(UserAdmin):
class Meta:
model = User
fields = "__all__"
readonly_fields = ('date_joined',)
def clean_email(self):
email = self.cleaned_data.get('email')
if email and User.objects.filter(email=email).exists():
raise forms.ValidationError(u'Email addresses must be unique.')
return email

此验证消息不显示在"用户"窗体中。

自定义用户管理员定义为

class CustomUserAdmin(UserAdmin):
def save(UserForm, commit=True):
return super(UserForm, self).save(commit=False)
if User.objects.filter(email=email).exists():
raise forms.ValidationError(_("Email already exists ya"),
code='invalid')
inlines = (ProfileInline, )
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

此验证消息在调试模式下的回溯中看到,而不是在用户窗体中。

要求消息在用户窗体中显示错误。我知道有两种形式,即。 UserCreationForm,django auth 中的 UserChangeForm。

使用 django 3.0, python 3.7

您应该在模型类中使用 clean 方法。 将此代码添加到您的用户(您应该自定义身份验证的用户模型(中 models.py.

from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError
class User(AbstractUser):
# add clean method here
def clean(self):
if User.objects.filter(email=email).exists():
raise ValidationError(_("Email already exists ya"), code='invalid')

此方法用于验证模型字段。

如果我在你的地方,我会在你的用户模型的电子邮件字段中放一个唯一的 = True。然后 Django 将负责其余的工作,无需自定义表单验证。

不要使用clean_email,而是尝试使用 clean .前任:

from django.contrib.auth.forms import UserCreationForm, UserChangeForm 
from django.contrib.auth.admin import UserAdmin
class UserForm(UserAdmin):
class Meta:
model = User
fields = "__all__"
readonly_fields = ('date_joined',)
def clean(self):
cleaned_data = super().clean()
email = cleaned_data.get('email')
if email and User.objects.filter(email=email).exists():
raise forms.ValidationError(u'Email addresses must be unique.')

您可以创建自定义验证程序,并在字段创建中将其作为"验证程序"参数提供。

这是自定义验证器:

from django.core.exceptions import ValidationError
def email_validator(email):
if User.objects.filter(email=email).exists():
raise ValidationError("Email already exists ya", code='invalid')

然后在用户模型的电子邮件字段中,只需在验证器参数中提供此email_validator,如下所示:

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# other fields
email = models.EmailField("email", unique=True, validators=[email_validator])

Django 将使用你的自定义验证器,它会在用户创建表单的字段下方显示错误。

相关内容

最新更新