扩展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 相关文章推荐
Hadoop中的Python框架的使用指南
Apr 22 Python
Python 数据结构之队列的实现
Jan 22 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
详解用python写一个抽奖程序
May 10 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
python爬取本站电子书信息并入库的实现代码
Jan 20 Python
python时间序列数据转为timestamp格式的方法
Aug 03 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
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
php中apc缓存使用示例
2013/12/25 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
js实现3D旋转相册
2020/08/02 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python中操作MySQL入门实例
2015/02/08 Python
Python数据结构之翻转链表
2017/02/25 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
如何使用python操作vmware
2019/07/27 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
美术师范毕业生自荐信
2013/11/16 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
入股协议书范本
2014/04/14 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
十八大观后感
2015/06/12 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB