扩展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中的XML库4Suite Server的介绍
Apr 14 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
python操作mysql数据库
Mar 05 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
详解Python3的TFTP文件传输
Jun 26 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
Python基于paramunittest模块实现excl参数化
Apr 26 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php 文本文件的读取效率
2012/02/10 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
django初始化数据库的实例
2018/05/27 Python
python生成lmdb格式的文件实例
2018/11/08 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
医药营销个人求职信
2014/04/12 职场文书
中秋晚会策划方案
2014/06/12 职场文书
小学生春游活动方案
2014/08/20 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
数据库之SQL技巧整理案例
2021/07/07 SQL Server
Android存储中最基本的文件存储方式
2022/04/30 Java/Android
Java实现简单小画板
2022/06/10 Java/Android