django admin-过滤器
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 会自动列出所有不同的姓:

当然,其指定的字段应该是BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey 或ManyToManyField中的一种。并且其属性可以为对应关联的外键,通过两个下划线指定关联表中对应属性:FK__key
激活带选项的属性
很多时候,我们的属性只有固定的几种类别,比如性别;一般我们会为该属性绑定选项,这样在展示时也更加直观:
choices_gender = [
    (0, 'male'),
    (1, 'femal'),
]
这时,我们在激活该属性的过滤器,显示的就是选项所对应的值,而不是数据库真正存储的值:

自定义查询的过滤器(SimpleListFilter)
继承自 django.contrib.admin.SimpleListFilter 的类,需要给它提供 title 和 parameter_name 属性来重写 lookups 和 queryset 方法,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 中定义的选项:

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

自定义输入框查询(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.py中TEMPLATES的'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 %}

参考文献
- django 文档
 - django源码:django/contrib/admin/filters.py
 - django-daterange-filter
 - stackoverflow
 
django admin-过滤器的更多相关文章
- Django admin site(一)ModelAdmin Options
		
Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 要使用admin,可以按照下面的步骤: 将'dj ...
 - Django Admin 简单部署上线
		
前言 打算为公司弄一个管理公用密码的平台,由于比较懒,就选择使用Django admin,默认的admin并不漂亮,于是我使用了这个django-suit插件来美化 如图: 是不是比原来的漂亮多了. ...
 - django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)
		
Django admin 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
 - DJANGO ADMIN 一些有用的设置(转)
		
DJANGO ADMIN 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
 - django admin 使用
		
Django admin 中一些常用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索 ...
 - 你应该使用 Django admin 的 9 个理由(转)
		
你应该使用 Django admin 的 9 个理由 “问题是,我问到的每个人都持反对意见,他们认为 admin 只限于超级用户,很不灵活并且是难以定制.”—来自 Reddit 的 andybak 我 ...
 - Django admin 的 9 个技巧
		
Tip 1:Django admin 后台不限于用 Django 开发的网站 虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的 ...
 - Django admin操作
		
无名小妖 昵称:无名小妖园龄:1年6个月粉丝:22关注:1 +加关注 搜索 常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 Python(1) python3 ...
 - python工业互联网应用实战3—Django Admin列表
		
Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...
 - Django admin美化插件suit应用[原创]
		
前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...
 
随机推荐
- 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合
			
本文翻译自官网:Streaming Aggregation https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...
 - spark配置文件
			
spark-env.sh export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoopexport SPARK_DIST_CLASSPATH=$(hadoop clas ...
 - mybatis批量新增或更新
			
mysql中在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE时,向数据库中插入一条记录: 若插入数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作(UPDA ...
 - Win7下Powershell 由2.0 升级为 5.1
			
今天在构建脚本的时候老是提示 Windows 7 默认的Powershell是2.0,查看版本 下载 https://www.microsoft.com/en-us/download/details. ...
 - LeetCode 5216. 统计元音字母序列的数目(Java)DP
			
5216. 统计元音字母序列的数目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', ...
 - SQLite接口函数 - C核心api实践与总结
			
SQLite核心源代码由C语言写就,同时提供了很多的扩展包可应用于其他编程语言和类库,如Python.Ruby.Java.Perl..Net/C#.Qt和ODBC.在很多情况下,针对一种语言有很多扩展 ...
 - JMeter安装及简单应用示例
			
一.Jmeter下载 官网地址:http://jmeter.apache.org/ 1.进入官网 2.选中一个版本下载 3.解压安装即可 二.Jmeter环境变量配置 1. 电脑桌面----> ...
 - 转!!通俗理解数字加密,数字签名,数字证书和https
			
原博文地址:https://www.jianshu.com/p/4932cb1499bf 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应. ...
 - 【代码优化】C#遍历所有控件(Control方法)
			
直接上代码: /// <summary> /// 判断价格是否可以购买技能的方法 /// </summary> /// <param name="btnBuyA ...
 - C#录制屏幕采集系统桌面画面
			
在项目中,有很多需要录制屏幕的场景,比如直播课,录制教学视频等场景.但.NET自带的Screen类功能比较弱,效率很低.那么如何简单快捷地高效采集桌面屏幕呢?当然是采用SharpCapture!下面开 ...