扩展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 04 Python
Python3访问并下载网页内容的方法
Jul 28 Python
详解Python中的array数组模块相关使用
Jul 05 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
python实现烟花小程序
Jan 30 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
解决python tkinter界面卡死的问题
Jul 17 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
pygame实现弹球游戏
Apr 14 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函数serialize()与unserialize()用法实例
2014/11/06 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
中止javascript执行的方法
2014/02/14 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python求解平方根的方法
2015/03/11 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
C#笔试题集合
2013/06/21 面试题
一些关于MySql加速和优化的面试题
2014/01/30 面试题
计算机毕业大学生推荐信
2013/12/01 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
python代码实现备忘录案例讲解
2021/07/26 Python