覆盖 django 管理员身份验证

Override django admin authentication

我正在使用 Django 2.1.5。我想覆盖 django 管理员身份验证过程,objective 允许 is_staff=False 的用户能够登录。所以,我试图覆盖 AdminSite 并遵循此文档 (https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-default-admin-site)。这是到目前为止的代码:


my_app/forms.py

from django.contrib.admin.forms import AdminAuthenticationForm

class CustomAdminAuthenticationForm(AdminAuthenticationForm):

    def confirm_login_allowed(self, user):
        super().confirm_login_allowed(user)   # i removed is_staff checking here

my_app/admin.py

class MyAdminSite(admin.AdminSite):
    login_form = CustomAdminAuthenticationForm

    def has_permission(self, request):
        return request.user.is_active   # i also removed request.user.is_staff here

my_app/apps.py

from django.contrib.admin.apps import AdminConfig

class MyAdminConfig(AdminConfig):
    default_site = 'my_app.admin.MyAdminSite'

root/settings.py

INSTALLED_APPS = [
    'my_app.apps.MyAdminConfig',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'my_app',
]

当我尝试运行服务器时,出现错误:

ImportError: Module "my_app.admin" does not define a "MyAdminSite" attribute/class

我想我在 my_app/apps.py 中正确地指向了 default_site。我怎样才能解决这个问题?除了覆盖 AdminSite 之外,还有其他方法可以完成我的 objective 吗?谢谢。

这似乎很麻烦,而不是仅仅为每个用户分配职员角色。 Django docsUser 中的 is_staff 字段定义为一个布尔值,表示“[d]指定此用户是否可以访问管理站点”。这不就是你想要的吗?

换句话说:如果您希望所有用户都能够访问管理站点,您还需要什么 is_staff 来阻止您将所有用户设为员工?