Django自带的过滤器功能有限,有时候满足自己的需求只能定制化
例如现在要做一个排除的过滤器,选中这个关键词后会排除跟这个有关的内容。
class AuthorFilter(admin.SimpleListFilter):
title = '排除提交者' # 过滤标题显示为"排除提交者"
parameter_name = 'exclude' # 过滤器使用的过滤字段
def lookups(self, request, model_admin):
'''针对字段值设置过滤器的显示效果'''
Userslist = []
users = Author.objects.values("author")
for user in users:
userinfo = (user['author'], user['author'])
Userslist.append(userinfo)
return list(set(Userslist))
def queryset(self, request, queryset):
'''定义过滤器的过滤动作'''
if request.GET.get('exclude') and request.GET.get('author'):
exclude_author = request.GET.get('gender')
author = request.GET.get('author')
return Vuldbdetail.objects.filter(Q(status='0') & Q(author=author) & ~Q(author=exclude_author)).all()
elif request.GET.get('exclude') is None and request.GET.get('author'):
author = request.GET.get('author')
return Author.objects.filter(Q(status='0') & Q(author=author)).all()
elif request.GET.get('exclude') and request.GET.get('author') is None:
exclude_author = request.GET.get('gender')
return Author.objects.filter(Q(status='0') & ~Q(author=exclude_author)).all()
else:
return Author.objects.filter(status='0').all()
list_filter = ('author',AuthorFilter,)
效果如下: