【问题标题】:Model inherited from AbstractUser doesn't hash password field从 AbstractUser 继承的模型不散列密码字段
【发布时间】:2013-02-28 22:18:02
【问题描述】:

我有一个继承自 AbstractUser 的模型,如下所示:

class Driver(AbstractUser):
  dni = models.CharField(max_length=8,validators=[validate_dni],unique=True)
  license = models.CharField(max_length=9,unique=True)
  birthday = models.DateField()
  sex = models.CharField(max_length=1, choices=SEX_CHOICES)
  creation_date = models.DateField(auto_now = True)

据此:https://docs.djangoproject.com/en/dev/topics/auth/customizing/

如果您对 Django 的 User 模型非常满意,并且只想 添加一些额外的配置文件信息,您可以简单地子类化 django.contrib.auth.models.AbstractUser 并添加您的自定义配置文件 字段。此类提供默认的完整实现 用户作为抽象模型。

但是,在我的管理员视图中,密码字段是简单的文本输入,密码保存为原始文本。我可以尝试使用 AbstractBaseUser 但首先我需要澄清这个问题。我是从 Django 开始的,所以我是一个小新手。

谢谢。

【问题讨论】:

    标签: django django-models django-forms django-admin django-views


    【解决方案1】:

    您不必实际定义自己的函数。您只需使用 django.contrib.auth.admin 中的 UserAdmin 类注册它,它就可以开箱即用。

    明确地,在您的 admin.py 文件中确保您具有以下内容:

    from django.contrib.auth.admin import UserAdmin
    admin.site.register(CustomUserModel, UserAdmin)
    

    如果您的模型上有其他自定义字段,上述注册方式将使它们不会显示在管理员中。在这种情况下,您可以通过使您的自定义 Admin 类继承自 UserAdmin 类来使其工作,如下所示:

    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin
    
    @admin.register(CustomUserModel)
    class CustomUserModelAdmin(UserAdmin):
        ...
    

    【讨论】:

    • 当我使用UserAdmin 注册它时,我的自定义选项消失了。知道为什么吗?
    • 是的,管理类指定出现哪些字段等。您可以创建一个继承自 UserAdmin 并包含您的自定义字段的新类。然后使用您的自定义用户模型注册新的管理类。
    • 添加此行 admin.site.register(CustomUserModel, UserAdmin) 后,我的自定义字段从管理员中消失
    • 我也有同样的事情
    • @mr_bulrathi:我更新了答案以包含一个带有自定义管理模型的示例,这是您需要做的才能使密码散列正确并显示您的自定义字段。
    【解决方案2】:

    您需要定义一个函数来散列该密码。我认为您直接将其保存到数据库中。

    class MyForm(forms.ModelForm):
        ............
        def save(self, commit=True):
            # Save the provided password in hashed format
            user = super(MyForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password"])
            if commit:
                user.save()
            return user
    

    【讨论】:

    • 谢谢,它有效。我认为没有必要编辑保存方法或显式调用“set_password”方法。
    【解决方案3】:

    程序 djnago >=3.0

    models.py

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
        YEAR_IN_SCHOOL_CHOICES = [('1', '1 class'),('2', '2 class'),('3', '3 class'),('4', '4 class'),('5', '5 class'),('6', '6 class'),('7', '7 class'),('8', '8 class'),('9', '9 class'),('10', '10th class'),]
        
        class User(AbstractUser):
            type = models.CharField(max_length=256, choices=(('1','Student'), ('2','Professor'), ('3','lower_staf')), default='1')  
        
        
        class Student(models.Model):
            user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True )
            gender = models.BooleanField(choices=((1,'Male'), (2,'Female'), (3,'Trans')), 
        
            def __str__(self):
                return '{}'.format(self.user)
    

    admin.py

    from django.contrib import admin
    from.models import User, Student
    from django.contrib.auth.admin import UserAdmin
    
    class CustomUserAdmin(UserAdmin):
    
        fieldsets = UserAdmin.fieldsets + ((None, {'fields': ('type',)}),)
        add_fieldsets = UserAdmin.add_fieldsets + ((None, {'fields': ('type',)}),)
    
    class Student_admin(admin.ModelAdmin):
        pass
    
    admin.site.register(User, CustomUserAdmin)
    admin.site.register(Student, Student_admin)
    

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2012-09-27
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多