扩展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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
详解Python中with语句的用法
Apr 15 Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
在python中安装basemap的教程
Sep 20 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
浅析pandas随机排列与随机抽样
Jan 22 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
Javascript事件实例详解
2013/11/06 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
python中pop()函数的语法与实例
2020/12/01 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
月考总结与反思
2015/10/22 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL