扩展Django admin的list_filter()可使用范围方法


Posted in Python onAugust 21, 2019

需求描述

有时候我们会基于已有数据生成一列在表格中,类似于下面的

class BaseSchema(models.Model):
 ...
 def test_status(self):
 # pdb.set_trace()
 if datetime.date.today() < self.test_start_date:
  return '未到测试区间'
 elif self.test_end_date and datetime.date.today() > self.test_end_date:
  return format_html('<p style="color: red">已下线</p>')
 else:
  return format_html('<p style="color: green">进行中</p>')

 test_status.short_description = u'测试状态'

但同时我们也希望可以对这一列进行筛选,按常规的话也就是添加到list_filter中:

list_filter = ('test_status')

这时候我们会看到django的温馨报错:

The value of 'list_filter[0]' refers to 'test_status', which does not refer to a Field.

也就是说不能使用list_filter对非Field进行筛选。

解决办法

最简单的方法

那就是把这个字段记录进field啊,这样就可以用了。但是我并不想这么做

更高端的方法

参考https://stackoverflow.com/questions/12102697/creating-custom-filters-for-list-filter-in-django-admin/45136544#45136544第二个回答中的事例:

from django.contrib.admin import SimpleListFilter

class CountryFilter(SimpleListFilter):
 title = 'country' # or use _('country') for translated title
 parameter_name = 'country'

 def lookups(self, request, model_admin):
 countries = set([c.country for c in model_admin.model.objects.all()])
 return [(c.id, c.name) for c in countries] + [
  ('AFRICA', 'AFRICA - ALL')]

 def queryset(self, request, queryset):
 if self.value() == 'AFRICA':
  return queryset.filter(country__continent='Africa')
 if self.value():
  return queryset.filter(country__id__exact=self.value())

class CityAdmin(ModelAdmin):
 list_filter = (CountryFilter,)

现在我们知道django中是这样实现的筛选的方法,那我们只要覆盖这个方法就好了:

class StatusFilter(SimpleListFilter):
 title = 'status'
 parameter_name = 'status'

 def lookups(self, request, model_admin):
 return [(1, '已下线'), (2, '进行中'), (3, '未到测试区间')]

 def queryset(self, request, queryset):
 this_day = datetime.date.today()
 # pdb.set_trace()
 if self.value() == '3':
  return queryset.filter(test_start_date__gt=this_day)
 elif self.value() == '1':
  return queryset.filter(test_end_date__lt=this_day)
 elif self.value() == '2':
  return queryset.filter(test_end_date__gte=this_day, test_start_date__lte=this_day)

然后在添加进list_filter中:

list_filter = (StatusFilter,)

bingo!

扩展Django admin的list_filter()可使用范围方法

以上这篇扩展Django admin的list_filter()可使用范围方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本实现自动发带图的微博
Apr 27 Python
python实现折半查找和归并排序算法
Apr 14 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
Python中那些 Pythonic的写法详解
Jul 02 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python上传时包含boundary时的解决方法
Apr 08 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
python新手学习可变和不可变对象
Jun 11 Python
在keras中实现查看其训练loss值
Jun 16 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
python机器学习包mlxtend的安装和配置详解
Aug 21 #Python
python 画出使用分类器得到的决策边界
Aug 21 #Python
Django url,从一个页面调到另个页面的方法
Aug 21 #Python
python requests更换代理适用于IP频率限制的方法
Aug 21 #Python
docker django无法访问redis容器的解决方法
Aug 21 #Python
django和vue实现数据交互的方法
Aug 21 #Python
python防止随意修改类属性的实现方法
Aug 21 #Python
You might like
一个PHP+MSSQL分页的例子
2006/10/09 PHP
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
学习php分页代码实例
2013/10/24 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
财经学院自荐信范文
2014/02/02 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
打架检讨书
2015/01/27 职场文书
送给客户微信问候语!
2019/07/04 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
python 实现德洛内三角剖分的操作
2021/04/22 Python
如何正确理解python装饰器
2021/06/15 Python