Django Admin - 允许为 is_staff 用户显示模型

Posted

技术标签:

【中文标题】Django Admin - 允许为 is_staff 用户显示模型【英文标题】:Django Admin - Allow models to be shown for is_staff users 【发布时间】:2016-04-06 13:29:15 【问题描述】:

我需要在 Django 管理界面中为is_staff=True 用户提供一些 Django 模型。 我不想为每个用户分配权限或组权限给员工用户。

我需要在ModelAdminBaseModelAdmin 类中重写哪个方法,或者还有其他更简单的方法吗? 我正在使用 Django 1.4 版本

【问题讨论】:

我不明白。您希望仅针对“员工”限制某些模型,但您不知道哪些用户是“员工”?那么它是如何工作的呢? 我将使用 auth_user 模型中的 is_staff 来确定哪些用户是员工。我有一个要求,员工用户(auth_user 模型中的 is_staff=True)也应该在特定模型上执行 CRUD 操作。 所以使用staff_member_required装饰器,但首先它们必须属于这个组,但是你写了你不想在每个USER中输入并将其添加到组中。 【参考方案1】:
class TeacherAdmin(admin.ModelAdmin):
    def has_add_permission(self, request):
        return True
    def has_change_permission(self, request, obj=None):
        return True
    def has_module_permission(self, request):
        return True

has_module_permission 检查模型是否可以在应用标签表中列出

【讨论】:

这似乎是正确的答案。至少在您想使用 is_staff 标志作为查看特定 ModelAdmin 的一揽子权限的情况下。我将此has_module_permission 与@mishbah 提到的mixin 结合使用。【参考方案2】:

这样的事情应该可以工作:

class StaffRequiredAdminMixin(object):

    def check_perm(self, user_obj):
        if not user_obj.is_active or user_obj.is_anonymous():
            return False
        if user_obj.is_superuser or user_obj.is_staff:
            return True
        return False

    def has_add_permission(self, request):
        return self.check_perm(request.user)

    def has_change_permission(self, request, obj=None):
        return self.check_perm(request.user)

    def has_delete_permission(self, request, obj=None):
        return self.check_perm(request.user)

并且所有 ModelAdmin(s) 都应该继承这个类。例如:

class MyModelAdmin(StaffRequiredAdminMixin, admin.ModelAdmin):
    pass

admin.site.register(MyModel, MyModelAdmin)

请注意,此代码未经测试。

【讨论】:

您的代码看起来非常好。但是除非我在权限表中明确提供其权限,否则该模型不会在员工用户的管理模板中列出。我只是想绕过分配权限/组权限。一旦我在我的管理模板中为员工用户列出了该模型,此代码就会显示出来。 请记住,mixin 必须是第一个,因为解决方法的优先级是从左到右。【参考方案3】:

staff_member_required 装饰器

staff_member_required(redirect_field_name='next', login_url='admin:login') [source]

此装饰器用于需要授权的管理视图。用这个函数装饰的视图 会有以下行为:

如果用户已登录,是工作人员 (User.is_staff=True),并且 处于活动状态(User.is_active=True),正常执行视图。

否则,请求将被重定向到 login_url 指定的 URL 参数,在查询字符串中带有最初请求的路径 由 redirect_field_name 指定的变量。例如: /admin/login/?next=/admin/polls/question/3/.

示例用法:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def my_view(request):
    ...

【讨论】:

我必须使用 django 管理系统。因为我使用的是 Django 的管理界面,所以我没有调用任何视图函数。 这是管理视图装饰器 当我登录我的网站127.0.0.1:8287/admin 并且我的用户是员工用户 (is_staff=True) 时,如何在 django 管理界面中查看这些模型。我只看到此用户 - “您无权编辑任何内容”。但对于管理员使用 (is_admin=True) 我看到了所有已注册模型的列表。

以上是关于Django Admin - 允许为 is_staff 用户显示模型的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin Cookbook-19如何在管理后台中一个模型只允许创建一个对象

Django Admin-禁用编辑并删除特定模型的“保存”按钮

根据值在 Admin 中自定义 Django 表单字段

Django Admin 根据其他选择动态禁用字段

Django admin list_filter 重复

Django-Admin 和 Django-Summernote 在我的表单中创建一个文件字段