【问题标题】:Django display user form validation error message when inherited from UserAdmin从 UserAdmin 继承时,Django 显示用户表单验证错误消息
【发布时间】:2020-06-01 05:33:57
【问题描述】:

我正在使用带有配置文件的 django 用户模型来扩展用户的更多属性。我需要确保 User 表中用户的电子邮件 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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果我在你的位置,我会在你的用户模型的电子邮件字段上放置一个 unique = True。然后 Django 会处理剩下的事情,不需要自定义表单验证。

      【讨论】:

        【解决方案3】:

        不要使用 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.')
        

        【讨论】:

          【解决方案4】:

          您可以创建自定义验证器并将其作为“验证器”参数在字段创建中提供。

          这是自定义验证器:

          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 将使用您的自定义验证器,它会在用户创建表单的字段下方显示错误。

          希望这会有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-11
            • 2018-05-30
            • 1970-01-01
            • 1970-01-01
            • 2016-03-05
            • 1970-01-01
            • 2022-11-09
            • 1970-01-01
            相关资源
            最近更新 更多