扩展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使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
Python列表解析配合if else的方法
Jun 23 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python使用thrift教程的方法示例
Mar 21 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
python 提取html文本的方法
May 20 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+mysql扎实个人基本功
2008/03/27 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
实例讲解php实现多线程
2019/01/27 PHP
将json对象转换为字符串的方法
2014/02/20 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
js实现自定义路由
2017/02/04 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
Python中的上下文管理器和with语句的使用
2018/04/17 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
tensorboard显示空白的解决
2020/02/15 Python
django admin 添加自定义链接方式
2020/03/11 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
工程安全员岗位职责
2014/03/09 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
老干部座谈会主持词
2015/07/03 职场文书
春节慰问简报
2015/07/21 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python