扩展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之玩转字符串(3)
Sep 14 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
python异常和文件处理机制详解
Jul 19 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
pycharm新建一个python工程步骤
Jul 16 Python
python如何统计代码运行的时长
Jul 24 Python
ipad上运行python的方法步骤
Oct 12 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
python爬取微博评论的实例讲解
Jan 15 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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 db类库进行数据库操作
2009/03/19 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
wxPython窗口的继承机制实例分析
2014/09/28 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
Python语言快速上手学习方法
2018/12/14 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
美德好少年主要事迹
2014/01/29 职场文书
家电业务员岗位职责
2014/03/10 职场文书
社区党务公开实施方案
2014/03/18 职场文书
分层教学实施方案
2014/03/19 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
护理专业自荐书
2014/06/04 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
个人先进事迹材料
2014/12/29 职场文书
2015年环保局工作总结
2015/05/22 职场文书
浅谈Python数学建模之线性规划
2021/06/23 Python