python - 从 UserAdmin 继承时,Django 显示用户表单验证错误消息
问题描述
我正在使用带有配置文件的 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
此验证消息不会显示在用户表单中。
自定义用户 admin 定义为
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)
此验证消息在调试模式下的回溯中可见,而不是在用户窗体中。
要求消息在用户窗体中显示错误。我知道有两种形式,即。django auth 中的 UserCreationForm、UserChangeForm。
使用 django 3.0、python 3.7
解决方案
您应该在 Model 类中使用 clean 方法。在models.py中将此代码添加到您的用户中(您应该自定义auth的用户模型)。
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')
此方法用于验证模型的字段。
推荐阅读
- pytorch - 为什么不使用 torch.cuda.empty_cache() 释放 CUDA 内存
- c - 处理字符时出现分段错误
- mysql - 计算行数使用类似mysql的条件
- unix - Shell 脚本 - 无法使用输出变量
- sonarqube - 执行扫描时出现声纳错误(java.lang.ExceptionInInitializerErrorjava.lang.ExceptionInInitializerError)
- c# - 可重复使用的标签动画弄乱了堆栈布局
- pandas - 根据条件用 np.select 和 np.where 替换 df 中的值
- ansible - 所有文件中的内容都没有在 ansible 中使用 grep 解析
- angular - 角度 ControlValueAccessor 检查是否使用 ngModel 绑定
- react-native - (JS/react-native)如何解决这个错误,为 iOS 构建 react-native 应用程序