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

Posted

技术标签:

【中文标题】Django 管理员无法使用自定义用户模型正确登录【英文标题】:Django admin does not login properly with custom User model 【发布时间】:2013-02-17 08:24:01 【问题描述】:

我将我在 Django 1.4.5 上的应用升级到 Django 1.5,并刚刚完成迁移到自定义用户模型。当我使用我自己的身份验证表单和我的超级用户凭据(在执行manage.py syncdb 时创建)登录我的应用程序时,一切正常。

我能够通过身份验证,如果我转到/admin,我已经按预期登录。我能够完美地导航和使用管理面板。但是,如果我尝试使用 django 管理员登录表单从 /admin 登录到管理面板,则会收到错误消息:

请输入正确的员工帐户电子邮件和密码。笔记 这两个字段都可能区分大小写。

我做了一些调查,认为这可能与ModelAdmin 有关,所以我从文档中关注this example 并创建了一个自定义ModelAdmin。但是,问题仍然存在。

有什么可能导致这种情况的想法吗?

【问题讨论】:

你在 settings.py 中设置了 AUTH_USER_MODEL,对吧? 是的,我有那套。 您是否使用AbstractUserAbstractBaseUser 作为您的用户模型扩展? 我用过AbstractBaseUser 超级用户必须等于 True 这就是为什么您无法登录管理页面 【参考方案1】:

您是否在BaseUserManager 下的create_superuser 函数中添加了以下行?它可能看起来像这样:

class CustomUserManager(BaseUserManager):
    def create_user(self, username, email, password=None):
        if not username:
            raise ValueError('Dude you need a username.')
        if not email:
            raise ValueError(
                'type an e-mail..')

        new_user = self.model(
            username=username,
            email=CustomUserManager.normalize_email(email))
        new_user.set_password(password)
        new_user.save(using=self._db)
        return new_user

  def create_superuser(self, username, email, password):
        new = self.create_user(
            username,
            email,
            password=password
        )
        new.is_active = True
        new.is_staff = True
        new.is_superuser = True
        new.save(using=self._db)
        return new

专注于:

    new.is_active = True
    new.is_staff = True
    new.is_superuser = True

【讨论】:

django 的管理员检查 request.user.is_activerequest.user.is_staff 以登录用户,所以我认为他应该将 new.is_active=True 添加到该列表以“关注”。 当我这样做时 is_staff = True 而不是 is_staff = False。管理员登录对我有用!【参考方案2】:

我遇到了同样的问题,但我发现@alix 的回答很有帮助。我忘了加is_active=True on create_superuser()

def create_staffuser(self, email, first_name=None, last_name=None, user_role=None, password=None):
    user = self.create_user(
        email,
        first_name=first_name,
        last_name=last_name,
        user_role=user_role,
        password=password,
        is_staff=True,
        is_active=True
    )
    return user

所以基本上你需要专注于 is_active 并检查你的

# changes the in-build User model to ours (Custom)
AUTH_USER_MODEL = 'accounts.User'

AUTHENTICATION_BACKENDS = (
    # Needed to login by custom User model, regardless of `allauth`
    "django.contrib.auth.backends.ModelBackend",

    # `allauth` specific authentication methods, such as login by e-mail
    "allauth.account.auth_backends.AuthenticationBackend",
)

【讨论】:

【参考方案3】:

是的,这部分成功了。感谢您对这些@gregoltsov 的指点

obj.is_active = True
obj.is_staff = True
obj.is_admin = True

我缺少的是 obj.is_active 部分。

【讨论】:

【参考方案4】:

答案是:

def create_superuser(self, username, email, password=None, **extra_fields):
    user = self.create_user(username, email, password=password, is_staff=True, **extra_fields)
    user.is_active = True
    user.save(using=self._db)
    return

如果它适合你,请投票。

【讨论】:

以上是关于Django 管理员无法使用自定义用户模型正确登录的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用自定义用户模型总是在模板中返回匿名用户

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

自定义Django登录,无法比较密码

在 Django 中覆盖默认用户模型后无法登录

无法使用正确的用户名和密码登录到 Django 管理员

Django自定义Auth模块方式