Python Django自定义身份验证-BaseUserManager';s创建未使用的用户

Python Django自定义身份验证-BaseUserManager';s创建未使用的用户,python,django,authentication,Python,Django,Authentication,我自定义Django的身份验证,现在每当我尝试使用Django Admin创建新用户时,该用户的密码都会直接保存,而不会被散列。我发现没有调用BaseUserManager类中的create_用户方法。当我使用bash创建超级用户时,它是正确完成的。我的模型有什么问题吗 设置.py AUTH_USER_MODEL = 'authentication.BaseAccount' apps/authentication/models.py class BaseAccountManager(BaseU

我自定义Django的身份验证,现在每当我尝试使用Django Admin创建新用户时,该用户的密码都会直接保存,而不会被散列。我发现没有调用BaseUserManager类中的create_用户方法。当我使用bash创建超级用户时,它是正确完成的。我的模型有什么问题吗

设置.py

AUTH_USER_MODEL = 'authentication.BaseAccount'
apps/authentication/models.py

class BaseAccountManager(BaseUserManager):
   def create_user(self, email, password=None, **kwargs):
      if not email:
          raise ValueError('Users must have a valid email address.')

      account = self.model(
        email=self.normalize_email(email)
      )
      account.set_password(password)
      account.save()

   return account

   def create_superuser(self, email, password, **kwargs):
      account = self.create_user(email, password, **kwargs)

      account.is_admin = True
      account.is_staff = True
      account.save()

   return account

class BaseAccount(AbstractBaseUser):
   email = models.EmailField(unique=True)

   first_name = models.CharField(max_length=40, blank=True)
   last_name = models.CharField(max_length=40, blank=True)

   is_admin = models.BooleanField(default=False)
   is_staff = models.BooleanField(default=False)

   created_at = models.DateTimeField(auto_now_add=True)
   updated_at = models.DateTimeField(auto_now=True)

   objects = BaseAccountManager()

   USERNAME_FIELD = 'email'

   def __unicode__(self):
      return self.email

   def get_full_name(self):
      return ' '.join([self.first_name, self.last_name])

   def get_short_name(self):
      return self.first_name

   def has_perm(self, perm, obj=None):
      return self.is_admin

   def has_module_perms(self, app_label):
      return self.is_admin

我找到了关于密码问题的答案,但我仍然不知道如何正确调用create_user函数。该示例删除用户名,而只使用电子邮件。我仍然在寻找从BaseUserManager点击自定义UserManager中定义的create_用户函数的方法。我的定制经理发送一封带有密码重置链接和一次性令牌的电子邮件。。。这将避免需要从django admin实际设置哈希密码

首先创建自己的表单:

# appname/forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from appname.models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    """
    A form that creates a user, with no privileges, from the given email and
    password.
    """

    def __init__(self, *args, **kargs):
        super(CustomUserCreationForm, self).__init__(*args, **kargs)
        del self.fields['username']

    class Meta:
        model = CustomUser
        fields = ("email",)

class CustomUserChangeForm(UserChangeForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """

    def __init__(self, *args, **kargs):
        super(CustomUserChangeForm, self).__init__(*args, **kargs)
        del self.fields['username']

    class Meta:
        model = CustomUser
然后使用这些表格:

# appname/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import ugettext_lazy as _

from appname.models import CustomUser
from appname.forms import CustomUserChangeForm, CustomUserCreationForm

class CustomUserAdmin(UserAdmin):
    # The forms to add and change user instances

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference the removed 'username' field
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                       'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2')}
        ),
    )
    form = CustomUserChangeForm
    add_form = CustomUserCreationForm
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email',)

admin.site.register(CustomUser, CustomUserAdmin)

对于未来的读者来说,因为这一期也让我的头撞到了墙上

要从django项目中的任何位置访问宝贵的
create_user()
方法,请执行以下操作:

from django.contrib.auth import get_user_model

class SomeClass():
    # This could be a form, for example...
    def some_function():
        get_user_model().objects.create_user()

如果您从某个自定义表单的
save()
方法调用它,请妥善处理
commit
参数,不要忘记在settings.py文件中注册您的自定义用户模型,如。

听起来您的模型管理员可能继承自
ModelAdmin
,因此,它缺少正确设置密码的代码。示例中的PermissionsMixin也很有用