扩展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遍历文件夹并删除特定格式文件的示例
Mar 05 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
python实现指定文件夹下的指定文件移动到指定位置
Sep 17 Python
python将list转为matrix的方法
Dec 12 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Python2与Python3的区别点整理
Dec 12 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 Python
Python实战之OpenCV实现猫脸检测
Jun 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中如何判断AJAX提交的数据
2012/02/05 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
JavaScript继承方式实例
2010/10/29 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
python中join()方法介绍
2018/10/11 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
python实现拼接图片
2020/03/23 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Python pip 常用命令汇总
2020/10/19 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
什么造成了Java里面的异常
2016/04/24 面试题
函授毕业生自我鉴定
2013/11/06 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
腾讯广告词
2014/03/19 职场文书
投资意向书范本
2014/04/01 职场文书
护士岗前培训心得体会
2016/01/08 职场文书