扩展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开发vim插件及心得分享
Nov 04 Python
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
Python判断Abundant Number的方法
Jun 15 Python
python实现基本进制转换的方法
Jul 11 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Python检测网站链接是否已存在
Apr 07 Python
Python算法应用实战之队列详解
Feb 04 Python
python分析作业提交情况
Nov 22 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
python 实现一个简单的线性回归案例
Dec 17 Python
python实现简易自习室座位预约系统
Jun 30 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短域名转换为实际域名函数
2011/01/17 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
js的写法基础分析
2011/01/17 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
SVG描边动画
2017/02/23 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
Python如何操作docker redis过程解析
2020/08/10 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
最新自我评价范文
2013/11/16 职场文书
个人自荐书
2013/12/20 职场文书
项目合作计划书
2014/01/09 职场文书
领导检查欢迎词
2014/01/14 职场文书
2014年内勤工作总结
2014/11/24 职场文书
少年犯观后感
2015/06/11 职场文书
八年级英语教学反思
2016/02/15 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
如何使用pdb进行Python调试
2021/06/30 Python
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android