django_admin详解(5)

自定义admin的filter筛选类

框架的好处,在于具有强大的拓展性,可以重写自己想要的功能。接下来,我们就重写admin的filter自定义搜索项的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class remark_time_filter(admin.SimpleListFilter):
# 思路:获取前端传来的查询字符串,自定义parameter_name,将查询字符串以键值赋给parameter_name,存储到字典中
# 然后自定义搜索项,针对搜索项,也就是所有的查询字符串,
# 匹配parameter_name的值,即查询字符串,根据其查询相应的查询集
title = '根据时间段搜索用户评论'
parameter_name = 'reward_time'

def lookups(self, request, model_admin):
"""制定搜索项"""
return [
('30_minutes', _('三十分钟内')),
('half_day', _('半天内')),
('1_hour', _('一小时内')),
('1_day', _('一天内')),
('7_day', _('一周内')),
('30_day', _('一个月内')),
]

def queryset(self, request, queryset):
if self.value() == '30_minutes':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(minutes=30),
reward_time__lte=datetime.now())
elif self.value() == '1_hour':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(hours=1),
reward_time__lte=datetime.now())
elif self.value() == 'half_day':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(hours=12),
reward_time__lte=datetime.now())
elif self.value() == '1_day':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(days=1),
reward_time__lte=datetime.now())
elif self.value() == '7_day':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(days=7),
reward_time__lte=datetime.now())
elif self.value() == '30_day':
return queryset.filter(reward_time__gte=datetime.now() - timedelta(days=30),
reward_time__lte=datetime.now())
else:
return queryset

说明:子类化SimpleListFilter类,添加到list_filter中。

看了源码后归纳出来的思路:

思路:
获取前端传来的查询字符串,自定义parameter_name,将查询字符串以键值赋给parameter_name,存储到字典中然后自定义搜索项,针对搜索项调用self.value(),去除parameter_name所对应的值,也就是所有的查询字符串,根据其返回相应的查询集。

注:
通过SimpleListFilter类的源码可以了解到框架一般通过函数和类来封装一系列的数据对象,并会在需要的时候调用,这样拓展性更高,很容易自定义子类。
而不会在仅在一个函数里实现功能!


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!