You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中AbstractUser无法调用set_password()等方法的问题

问题原因及解决办法

1. form.save(commit=False)无法调用set_password()的原因

你自定义的用户模型没有继承Django内置的AbstractBaseUser,这个基类封装了set_password()、check_password()这类密码管理的核心方法。如果你的用户模型只继承了models.Model,自然没有这些方法。

2. BaseUserManager中self.model()无set_password()和save()的原因

  • self.model指向的是你关联的用户模型,如果用户模型本身没继承AbstractBaseUser,实例化后自然没有set_password()方法;
  • save()是模型实例的基础方法,要是无法调用,大概率是用户模型的继承链有问题——比如没正确继承models.Model或AbstractBaseUser。

正确配置自定义用户模型的步骤

  • 自定义用户模型必须继承AbstractBaseUser和PermissionsMixin(后者负责权限相关功能):
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'  # 设置唯一标识字段
    REQUIRED_FIELDS = ['username']  # 创建超级用户时必填的字段

    objects = CustomUserManager()
  • 自定义用户管理器继承BaseUserManager,并实现创建用户和超级用户的方法:
from django.contrib.auth.base_user import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, username, password=None, **extra_fields):
        if not email:
            raise ValueError('用户必须提供邮箱')
        email = self.normalize_email(email)
        user = self.model(email=email, username=username, **extra_fields)
        # 此时user是AbstractBaseUser的实例,可以正常调用set_password
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(email, username, password, **extra_fields)
  • 在settings.py中指定自定义用户模型:
AUTH_USER_MODEL = '你的应用名.CustomUser'

内容的提问来源于stack exchange,提问作者user15746554

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:15:30