从AbstractUser继承的模型不会哈希密码字段

时间:2013-03-13 05:12:47

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

我有一个继承了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并添加您的自定义配置文件   领域。此类提供默认的完整实现   用户作为抽象模型。

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

感谢。

3 个答案:

答案 0 :(得分:9)

您不必实际定义自己的功能。您只需使用来自UserAdmin的{​​{1}}类注册它,它就可以开箱即用。

显然,在您的admin.py文件中,请确保您拥有以下内容:

django.contrib.auth.admin

答案 1 :(得分: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

答案 2 :(得分:-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)