从AbstractUser继承的模型无法哈希密码字段。

13

我有一个继承了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的用户模型并且只想添加一些额外的配置文件信息,那么您可以简单地子类化django.contrib.auth.models.AbstractUser并添加自定义配置文件字段。此类提供了默认User的完整实现作为一个抽象模型。

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

谢谢。

3个回答

21

你不需要实际定义自己的函数。你只需要将其注册到django.contrib.auth.admin中的UserAdmin类中即可,它会直接使用。

具体而言,在您的admin.py文件中,请确保包含以下内容:

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

如果您的模型上有额外的自定义字段,使用上述的注册方式将导致这些字段在管理员页面中不显示。在这种情况下,您可以通过让自定义管理类继承UserAdmin类来解决问题,如下所示:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

@admin.register(CustomUserModel)
class CustomUserModelAdmin(UserAdmin):
    ...

当我将其注册到UserAdmin时,我的自定义选项消失了。有任何想法是为什么? - Diego Fortes
1
是的,管理员类指定了哪些字段和其他内容出现。您可以创建一个继承自“UserAdmin”的新类,并包括您的自定义字段。然后将该新管理员类注册到您的自定义用户模型中。 - Kenny Loveall
1
在添加了这行代码 admin.site.register(CustomUserModel, UserAdmin) 后,我的自定义字段在管理员页面中消失了。 - Varniks
我有同样的东西。 - mr_bulrathi
2
@mr_bulrathi:我更新了答案,包括一个使用自定义管理员模型的示例,这是您需要做的,以便正确进行密码哈希并显示自定义字段。 - Kenny Loveall
@admin.register(CustomUserModel) 应该改为 @admin.register(CustomUserModelAdmin) 吗? - Baschdl

7
你需要定义一个函数来对密码进行哈希处理。我认为你可以将哈希后的密码直接保存到数据库中。
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”方法。 - Daniel Flores

-1

步骤 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接