Django后台视图逻辑修改:按用户权限展示商品实例
实现方法
最直接的方式就是自定义ModelAdmin并重写get_queryset方法,直接调整后台的查询逻辑,完全匹配你的需求:
- 在项目的
admin.py文件中,创建自定义的ModelAdmin类,重写get_queryset方法:
from django.contrib import admin from .models import GoodsDetails class GoodsDetailsAdmin(admin.ModelAdmin): list_display = ('serial_number', 'goods_description', 'quantity', 'gross_weight', 'is_active') # 可选,配置后台列表显示的字段 def get_queryset(self, request): qs = super().get_queryset(request) # 超级用户返回所有实例,普通用户只返回is_active=False的记录 if request.user.is_superuser: return qs return qs.filter(is_active=False) # 注册自定义的ModelAdmin到模型 admin.site.register(GoodsDetails, GoodsDetailsAdmin)
- 保存代码后重启Django服务,后台就会按规则展示数据:
- 超级用户登录后能查看所有
GoodsDetails实例 - 普通用户登录后仅能查看
is_active=False的实例
- 超级用户登录后能查看所有
其他可选方案
如果想通过权限控制实现更灵活的规则,也可以自定义权限后结合判断逻辑:
# 先在模型中添加自定义权限 class GoodsDetails(models.Model): # 原有字段... class Meta: permissions = [ ("view_all_goods", "Can view all goods instances"), ] # 然后在Admin中调整查询逻辑 class GoodsDetailsAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) # 超级用户或拥有自定义权限的用户可查看全部数据 if request.user.has_perm('yourapp.view_all_goods') or request.user.is_superuser: return qs return qs.filter(is_active=False)
这种方式可以给特定普通用户分配查看全部数据的权限,比单纯依赖超级用户身份更灵活。
内容的提问来源于stack exchange,提问作者Adarsh Pandey
相关产品推荐
相关产品推荐

