如何在Django CMS Admin中过滤排除指定对象?
Django CMS Admin 屏蔽特定对象的最优实现方式
最直接且彻底的实现方式是重写Admin类的get_queryset方法,通过exclude过滤掉你不想返回的对象,这比自定义列表过滤器更可靠——它会在所有Admin操作场景(列表页、详情页、编辑页等)生效,彻底屏蔽目标对象。
基础实现示例
from django.contrib import admin from .models import MyModule class MyModuleAdmin(admin.ModelAdmin): list_display = ['name'] def get_queryset(self, request): # 先获取默认的查询集 queryset = super().get_queryset(request) # 排除特定名称的对象(如果是关联字段,用my_module__name这样的关联语法) return queryset.exclude(name='moduleidontwant')
动态过滤(可选)
如果需要根据用户权限或其他条件动态决定是否屏蔽对象,可以在方法中添加判断逻辑:
def get_queryset(self, request): queryset = super().get_queryset(request) # 仅对非超级管理员隐藏该对象 if not request.user.is_superuser: queryset = queryset.exclude(name='moduleidontwant') return queryset
注:你尝试的
list_filter写法不符合Django语法规范,Django的列表过滤器需要使用内置或自定义过滤器类,而非直接写排除条件。如果仅需在列表页展示时过滤,也可以自定义过滤器,但这种方式无法阻止用户通过URL直接访问该对象的详情页,因此重写get_queryset是最优方案。
内容的提问来源于stack exchange,提问作者David A
相关产品推荐
相关产品推荐

