Django admin 根据权限过滤行

Posted

技术标签:

【中文标题】Django admin 根据权限过滤行【英文标题】:Django admin filter rows based on permissions 【发布时间】:2012-08-08 02:56:15 【问题描述】:

在 Django 管理中,我想根据用户只显示模型的某些行。

class Article(models.Model):
    text =          models.TextField(max_length=160)
    location =        models.CharField(max_length=20)

因此,当用户登录到管理站点并且是旧金山location 的一部分时,他们应该只能在该位置看到Articles

【问题讨论】:

【参考方案1】:

我认为你想要的是 ModelAdmin 的查询集:

https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset

class ArticleAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ArticleAdmin, self).queryset(request)
        if request.user.profile.location: # If the user has a location
            # change the queryset for this modeladmin
            qs = qs.filter(location=request.user.profile.location)
        return qs

这假设用户通过个人资料模型绑定到某个位置。

【讨论】:

【参考方案2】:

has_add_permissionhas_change_permissionhas_delete_permission 与custom ModelAdmin 一起使用(在admin.py 中):

class ArticleAdmin(admin.ModelAdmin):
    def has_add_permission(self, request):
        # Nothing really to do here, but shown just to be thorough
        return super(ArticleAdmin, self).has_add_permission(request)

    def has_change_permission(self, request, obj=None):
        if obj is not None:
            return obj.location == request.user.get_profile().location
        else:
            return super(ArticleAdmin, self).has_change_permission(request, obj=obj)

    def has_delete_permission(self, request, obj=None):
        if obj is not None:
            return obj.location == request.user.get_profile().location
        else:
            return super(ArticleAdmin, self).has_delete_permission(request, obj=obj)
admin.site.register(Article, ArticleAdmin)

【讨论】:

以上是关于Django admin 根据权限过滤行的主要内容,如果未能解决你的问题,请参考以下文章

python Django Admin:隐藏UserAdmin的权限,为GroupAdmin排除无用的权限

具有过滤查询集的组权限的自定义表单

Django admin,如何在 django 模板中正确检查用户的权限?

Django admin:代理模型的用户权限

Django Admin Cookbook-18如何限制对Django Admin管理部分功能的使用

使 django simple JWT 具有与 Django Admin 相同的权限