扩展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程序员易犯的错误
Dec 15 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
python得到单词模式的示例
Oct 15 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
Python中函数的返回值示例浅析
Aug 28 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
python将dict中的unicode打印成中文实例
May 11 Python
python自定义函数def的应用详解
Jun 03 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
python开发人人对战的五子棋小游戏
May 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中使用Imagick操作PSD文件实例
2015/01/26 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
让您的菜单不离网站
2006/10/03 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
使用p5.js临摹动态图片
2019/11/04 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python 3.8 新功能全解
2019/07/25 Python
Python的pygame安装教程详解
2020/02/10 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
Python自动化操作实现图例绘制
2020/07/09 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
好的促销活动方案
2014/08/21 职场文书
检讨书怎么写
2015/01/23 职场文书
三八妇女节致辞
2015/07/31 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android