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

13
我将我的Django 1.4.5应用程序升级到Django 1.5,并刚刚完成了迁移到自定义用户模型。当我使用自己的身份验证表单以超级用户凭据(在执行manage.py syncdb时创建)登录我的应用程序时,一切正常。我能够得到认证,如果我去/admin,我已经登录,就像预期的那样。我能够完美地导航和使用管理面板。然而,如果我尝试使用Django管理员登录表单从/admin登录到管理面板,我会收到以下错误消息:

请输入正确的工作人员帐户的电子邮件和密码。请注意,两个字段可能区分大小写。

我进行了一些调查,并认为它可能与ModelAdmin有关,因此我按照文档中的this example创建了一个自定义ModelAdmin。但是,问题仍然存在。你有什么想法是什么原因?

你在settings.py中设置了AUTH_USER_MODEL,对吧? - Andrew Gorcester
是的,我已经设置好了。 - Sanketh Katta
你在用户模型扩展中使用了AbstractUser还是AbstractBaseUser - Dan Hoerst
我使用了 AbstractBaseUser - Sanketh Katta
超级用户必须等于True,这就是为什么您无法登录管理员页面的原因。 - catherine
4个回答

10

你是否在 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

2
Django的管理后台检查request.user.is_activerequest.user.is_staff以登录用户,因此我认为他应该将new.is_active=True添加到该列表中以“关注”。 - AJJ
当我将is_staff = False改为is_staff = True时,管理员登录就可以正常工作了! - miltonbhowmick

2

我曾经遇到过相同的问题,但是我找到了@alix的答案非常有帮助。我忘记在create_superuser()中添加is_active=True

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",
)

0

答案是:

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

请投票表示是否对您有用。

0

没错,这部分就是关键。感谢 @gregoltsov 给出的指引。

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

我所缺少的是 obj.is_active 部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接