django框架的admin模块,通过list_filter提供给用户自定义分类查询的接口,并且我们可以在原有类的基础上扩展出符合自身应用场景的过滤器。

定义模型

以 Student 模型为准,管理类为 StudentAdmin。

class Student(models.Model):
id = models.AutoField(primary_key=True)
first_name = models.CharField(
max_length=20, verbose_name=u'姓')
last_name = models.CharField(
max_length=20, verbose_naem=u'名')
gender = models.IntegerField(
choices=choices_gender, verbose_name=u'性别')
age = models.IntegerField(
blank=True, verbose_name=u'年龄')
birthday = models.DateTimeField(
blank=True, verbose_name=u'生日')
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
list_display = ('id', 'first_name', 'last_name', 'gender', 'age', 'birthday')
list_per_page = 20

mysql创建student表:

CREATE TABLE student(
id int(10) NOT NULL AUTO_INCREMENT,
first_name varchar(20) NOT NULL,
last_name varchar(20) NOT NULL,
gender int(10) NOT NULL,
age int(10) NOT NULL,
birthday datetime,
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

直接激活过滤器

过滤器位于Admin页面的右侧,通过 list_filter 可以直接激活 Student 中已经存在的模型。注:list_filter 应该是一个列表或元组。

# 直接激活
list_filter = ('first_name',)

Filter 会自动列出所有不同的姓:

 
1-直接激活.png

当然,其指定的字段应该是BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey 或ManyToManyField中的一种。并且其属性可以为对应关联的外键,通过两个下划线指定关联表中对应属性:FK__key

激活带选项的属性

很多时候,我们的属性只有固定的几种类别,比如性别;一般我们会为该属性绑定选项,这样在展示时也更加直观:

choices_gender = [
(0, 'male'),
(1, 'femal'),
]

这时,我们在激活该属性的过滤器,显示的就是选项所对应的值,而不是数据库真正存储的值:

 
2-激活带选项的属性.png

自定义查询的过滤器(SimpleListFilter)

继承自 django.contrib.admin.SimpleListFilter 的类,需要给它提供 titleparameter_name 属性来重写 lookupsqueryset 方法,title为页面上该过滤器的标题、parameter为加载页面时url中携带的参数名称:

from django.utils.translation import ugettext_lazy as _

class AgeListFilter(admin.SimpleListFilter):
title = _(u'年龄段')
parameter_name = 'ages' def lookups(self, request, model_admin):
return (
('0', _(u'未成年')),
('1', _(u'成年人')),
('2', _(u'老年人')),
) def queryset(self, request, queryset):
if self.value() == '0':
return queryset.filter(age__lt='18')
if self.value() == '1':
return queryset.filter(age__gte='18', age__lte='50')
if self.value() == '2':
return queryset.filter(age__gt='50')
# 激活自定义过滤器
list_filter = (AgeListFilter,)

Filter 会列出 lookups 中定义的选项:

 
3-自定义查询的过滤器.png

日期的区间筛选(DateRangeFilter)

默认的时间筛选只能选取某一段时间至今这样的区间,而daterange_filter插件提供了自定义时间区间的筛选。使用DateRangeFilter 前需要安装插件包 pip install django-daterange-filter,并在settings.pyINSTALLED_APPS 中添加 daterange_filter

list_filter = (('birthday', DateRangeFilter), )
 
4-时间区间的过滤.png

自定义输入框查询(SingleTextInputFilter)

django自带的过滤器是不含输入框的,但是我们可以自己重写一个带输入框的过滤器,并且自己指定样式:

from django.contrib.admin import ListFilter

class SingleTextInputFilter(ListFilter):
"""
renders filter form with text input and submit button
"""
parameter_name = None
template = "textinput_filter.html" def __init__(self, request, params, model, model_admin):
super(SingleTextInputFilter, self).__init__(
request, params, model, model_admin)
if self.parameter_name is None:
raise ImproperlyConfigured(
"The list filter '%s' does not specify "
"a 'parameter_name'." % self.__class__.__name__) if self.parameter_name in params:
value = params.pop(self.parameter_name)
self.used_parameters[self.parameter_name] = value def value(self):
"""
Returns the value (in string format) provided in the request's
query string for this filter, if any. If the value wasn't provided then
returns None.
"""
return self.used_parameters.get(self.parameter_name, None) def has_output(self):
return True def expected_parameters(self):
"""
Returns the list of parameter names that are expected from the
request's query string and that will be used by this filter.
"""
return [self.parameter_name] def choices(self, cl):
all_choice = {
'selected': self.value() is None,
'query_string': cl.get_query_string({}, [self.parameter_name]),
'display': _('All'),
}
return ({
'get_query': cl.params,
'current_value': self.value(),
'all_choice': all_choice,
'parameter_name': self.parameter_name
}, ) class LastNameListFilter(SingleTextInputFilter):
title = 'Last Name'
parameter_name = 'last_name' def queryset(self, request, queryset):
if self.value():
return queryset.filter(last_name=self.value())

将 textinput_filter.html放在templates文件夹下,并在settings.pyTEMPLATES'DIRS',加上templates路径。

{% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3> {#i for item, to be short in names#}
{% with choices.0 as i %}
<ul>
<li>
<form method="get">
<input type="search" name="{{ i.parameter_name }}" value="{{ i.current_value|default_if_none:"" }}"/> {#create hidden inputs to preserve values from other filters and search field#}
{% for k, v in i.get_query.items %}
{% if not k == i.parameter_name %}
<input type="hidden" name="{{ k }}" value="{{ v }}">
{% endif %}
{% endfor %}
<input type="submit" value="{% trans 'apply' %}">
</form>
</li> {#show "All" link to reset current filter#}
<li{% if i.all_choice.selected %} class="selected"{% endif %}>
<a href="{{ i.all_choice.query_string|iriencode }}">
{{ i.all_choice.display }}
</a>
</li>
</ul>
{% endwith %}
 
5-自定义输入框查询.png

参考文献

django admin-过滤器的更多相关文章

  1. Django admin site(一)ModelAdmin Options

    Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 要使用admin,可以按照下面的步骤: 将'dj ...

  2. Django Admin 简单部署上线

    前言 打算为公司弄一个管理公用密码的平台,由于比较懒,就选择使用Django admin,默认的admin并不漂亮,于是我使用了这个django-suit插件来美化 如图: 是不是比原来的漂亮多了. ...

  3. django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)

    Django admin 一些有用的设置   Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...

  4. DJANGO ADMIN 一些有用的设置(转)

    DJANGO ADMIN 一些有用的设置   Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...

  5. django admin 使用

    Django admin 中一些常用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索 ...

  6. 你应该使用 Django admin 的 9 个理由(转)

    你应该使用 Django admin 的 9 个理由 “问题是,我问到的每个人都持反对意见,他们认为 admin 只限于超级用户,很不灵活并且是难以定制.”—来自 Reddit 的 andybak 我 ...

  7. Django admin 的 9 个技巧

    Tip 1:Django admin 后台不限于用 Django 开发的网站 虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的 ...

  8. Django admin操作

      无名小妖     昵称:无名小妖园龄:1年6个月粉丝:22关注:1 +加关注 搜索     常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 Python(1) python3 ...

  9. python工业互联网应用实战3—Django Admin列表

    Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...

  10. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

随机推荐

  1. pytorch 中conv1d操作

    参考:https://blog.csdn.net/liujh845633242/article/details/102668515 这里我重点说一下1D卷积,2D卷积很好理解,但是1D卷积就不是那么好 ...

  2. LeetCode 108. Convert Sorted Array to Binary Search Tree (将有序数组转换成BST)

    108. Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascendin ...

  3. 使用Win10自带的截图工具

    Win10自带的截图工具还是可以的,快捷键win+shift+s 截完图之后会有一个通知,你可以对截图进行二次编辑,编辑之后默认是立即保存的 再搭配着Fu图床工具使用,简直太爽了 讲一下怎么打开通知

  4. Caused by java.lang.Exception Failed to send data to Kafka Expiring

    flink 写kafka,报错,作业挂掉 Caused by: java.lang.Exception: Failed to send data to Kafka: Expiring 89 recor ...

  5. Instance Variable Hiding in Java

    class Test { // Instance variable or member variable private int value = 10; void method() { // This ...

  6. golang之defer

    概述 对于资源释放,有很多不同的实现方式,不同语言也有不同的惯用方法. C语言 :手动管理 Golang :defer Python :上下文管理器contexManager C++ : 作用域和析构 ...

  7. setPos 详解

    etWindowPos 详解   函数名: SetWindowPos 头文件: winuser.h 函数原型: BOOL SetWindowPos ( HWND hWnd, //窗口句柄 HWND h ...

  8. cocos creator图片渲染问题!

    问题:游戏项目需要添加一个开场剧情(); 第一时间使用了cc.component.scheduleOnce (), 里面的回调函数为 cc.loader.loadRes(). 进入游戏时,渲染主场景后 ...

  9. SpringBoot的入门程序

    1. 创建一个springboot工程 可以参考springboot入门程序 2. 创建一个实体类 @Data //想相当于@Setter.@Getter和@ToString替代了setter.get ...

  10. 2019三六零 java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.360等公司offer,岗位是Java后端开发,最终选择去了三六零. 面试了很多家公司,感觉大部分公司考察的点都差 ...