扩展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执行shell获取硬件参数写入mysql的方法
Dec 29 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
对python Tkinter Text的用法详解
Oct 11 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
Python基础之函数的定义与使用示例
Mar 23 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
通过实例解析Python调用json模块
Dec 11 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
keras 读取多标签图像数据方式
Jun 12 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
python爬虫要用到的库总结
Jul 28 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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函数
2006/12/06 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
php实现图片添加水印功能
2014/02/13 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
深入理解Python变量与常量
2016/06/02 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
Python笔记之代理模式
2019/11/20 Python
详解Scrapy Redis入门实战
2020/11/18 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
博士生导师推荐信
2014/07/08 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
实习生矿工检讨书
2014/10/13 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
红歌会主持词
2015/07/02 职场文书
学校少先队工作总结
2015/08/12 职场文书
《雷雨》教学反思
2016/02/20 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL