Django 自定义用户模型和超级用户

Posted

技术标签:

【中文标题】Django 自定义用户模型和超级用户【英文标题】:Django Custom User Model and SuperUser 【发布时间】:2021-12-01 10:25:53 【问题描述】:

我正在尝试创建一个 web3 用户可以使用他们的钱包登录的应用程序但我希望超级用户仍然使用用户名/密码。(我未来的计划是创建一个自定义后端执行 web3 身份验证流程)

我很接近这一点,因为我能够创建第一个可以使用用户名/密码的管理员,但意识到它在下一个 createsuperuser 上失败了:

django.db.utils.IntegrityError: UNIQUE constraint failed: users_web3user.public_address

所以我现在尝试只是添加一个随机整数来满足它,只是为了看看它是否可以工作,但同样的问题不断出现。

这是否是解决此问题并将我的用户与我的超级用户分开的正确方法? 此外,即使我在 settings.py 中设置了 user 是我的应用程序,我的调试器也永远不会被调用: AUTH_USER_MODEL = 'users.Web3User'

模型.py: Web3UserManager 类(BaseUserManager): def create_user(self, public_address): 如果不是公共地址: raise ValueError('用户必须有一个 public_address')

        user = self.model(
            public_address=public_address,
            nonce=secrets.token_urlsafe(32)
        )

        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None):
        import ipdb; ipdb.sset_trace()
        public_address=secrets.randbelow(299)
        print(public_address)
        user = self.create_user(
            username=username,
            password=password,
            public_address=public_address
        )
        user.is_admin = True
        user.save(using=self._db)
        return user



class Web3User(AbstractUser):
    public_address = models.CharField(max_length=64, unique=True)
    nonce = models.CharField(max_length=64)

【问题讨论】:

Web3User 用户是否还有用户名、电子邮件和姓名? @IainShelvington 不,他们不会——不是在我试图创建的这个简单的基本情况下 您的超级用户将在您的应用程序中登录/执行什么操作,他们是否会与您数据库中的任何内容相关联?最好使用单个用户模型,如果您只有几个超级用户,那么也许只需向 web3 用户添加一两个特殊情况可能会起作用 您是否意识到您的调试器从未被命中?将objects = Web3UserManager() 设置在Web3User 中,您应该能够找出其余的。 我投票结束这个问题,因为虽然类似的问题可能是这里的主题,但这个问题的解决方式不太可能帮助未来的读者。 【参考方案1】:
django_custom_user==0.7
AUTH_USER_MODEL = 'user.UserModel' -> settings.py

class UserModel(AbstractEmailUser, BaseModelFields):
   pass

使用包而不是做一些很酷的逻辑。

【讨论】:

我不想在用户中实现电子邮件。我需要超级用户和普通用户的两个差异用户模型。

以上是关于Django 自定义用户模型和超级用户的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO + JWT 令牌认证

Django 管理员无法使用自定义用户模型正确登录

Django admin - 模型对超级用户可见,而不是员工用户

无法创建超级用户 Django

Django 管理站点,更改不同用户的模型可见性

除超级用户外,如何使字段只在django admin中读取?