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 模型。
我不想为每个用户分配权限或组权限给员工用户。
我需要在ModelAdmin
或BaseModelAdmin
类中重写哪个方法,或者还有其他更简单的方法吗?
我正在使用 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如何在管理后台中一个模型只允许创建一个对象