首页 > 解决方案 > 从 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

标签: pythondjango

解决方案


您应该在 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')

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


推荐阅读