扩展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的Django框架中的ORM建立查询API
Apr 20 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
pytorch 查看cuda 版本方式
Jun 23 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
python 写一个水果忍者游戏
Jan 13 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 带逗号千位符数字的处理方法
2012/01/10 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
自动更新作用
2006/10/08 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
python程序封装为win32服务的方法
2021/03/07 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
施工安全协议书
2013/12/11 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
社区护士演讲稿
2014/08/27 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
Golang流模式之grpc的四种数据流
2022/04/13 Golang
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers