Django - Xadmin (四) Filter

Filter 功能描述

与 admin 组件中 Filter 功能类似,在展示页面右侧放置一列标签,通过点击这些标签来筛选出该标签相关的数据。

比如, Filter 中有关于出版社分类的标签,点击相关出版社的标签会将关于该出版社的书籍数据列出来。

实现过程实际上就是 a 标签加上后台数据筛选和标签渲染。

后台处理

后台处理主要分为两块, ModelXadmin 类中的处理和 ShowList 类中的处理。

ModelXadmin 类

首先,在 ModelXadmin 类中加上 Filter 字段。

filter_fields = []

Filter 功能实际上就是对数据的筛选,所以创建个函数用于根据前端传来的数据获取筛选条件。筛选条件是 GET 传来的参数,用 Q 函数类解决,因为筛选可以赋予多个条件,所以这之间是 “且” 的关系。

def get_filter_condition(self, request):
filter_condition = Q() for filter_field, val in request.GET.items():
if filter_field in self.filter_fields:
filter_condition.children.append((filter_field, val)) return filter_condition

获取了筛选条件就可直接进行筛选,而且 filter 函数可以直接过滤多个条件。

# 获取filter的Q对象
filter_connection = self.get_filter_condition(request) # 筛选数据
data_list = self.model.objects.filter(search_connection).filter(filter_connection)

ShowList 类

Filter 功能实现的最主要部分还是在 ShowList 类中,在此类中将需要的 a 标签构建并进行渲染。

遍历 filter_fields ,获取每个字段在模型表中对应的字段对象,根据字段类型不同以不同的方式获取字段的数据列表。

处理数据标签:

先判断该数据所属的字段对象是否为外键关联或者是多对多关联,如果是,获取其字段对象的主键和描述,并将主键作为传值参数;否则,将其描述作为传值参数。获取主键和描述的意义在于判断当前数据标签是否已被点击,被点击的标签返回的是带有激活样式的 a 标签。

同时,需要增加 “全部” 标签,对字段本身进行筛选。

def get_filter_linktags(self):
link_dic = {} for filter_field in self.config.filter_fields:
params = copy.deepcopy(self.request.GET)
cid = self.request.GET.get(filter_field, 0)
filter_field_obj = self.config.model._meta.get_field(filter_field) # 根据字段不同类型获取该字段的数据
if isinstance(filter_field_obj, ForeignKey) or isinstance(filter_field_obj, ManyToManyField):
data_list = filter_field_obj.rel.to.objects.all()
else:
data_list = self.config.model.objects.all().values("pk", filter_field) temp = [] # 处理 全部标签
if params.get(filter_field):
del params[filter_field]
temp.append("<a href='?%s'>全部</a>" % params.urlencode())
else:
temp.append("<a class='active' href='#'>全部</a>") # 处理数据标签
for obj in data_list:
if isinstance(filter_field_obj, ForeignKey) or isinstance(filter_field_obj, ManyToManyField):
pk = obj.pk
text = str(obj)
params[filter_field] = pk
else:
pk = obj.get("pk")
text = obj.get(filter_field)
params[filter_field] = text _url = params.urlencode() if cid == str(pk) or cid==text:
link_tag = "<a class='active' href='?%s'>%s</a>" % (_url, text)
else:
link_tag = "<a href='?%s'>%s</a>" % (_url, text) temp.append(link_tag) link_dic[filter_field] = temp return link_dic

前端处理

前端的处理以简单为准则。这次只需要对后台传来的有关数据标签的数据结构进行循环遍历且将相应字段放好即可。

<div class="col-md-3">
<div class="filter">
<h4>Filter</h4>
{% for filter_field, linktags in showlist.get_filter_linktags.items %}
<div class="well">
<p>BY {{ filter_field.upper }}</p>
{% for link in linktags %}
<p>{{ link|safe }}</p>
{% endfor %} </div> {% endfor %} </div>
</div>

完整代码:Filter功能 GitHub 地址

Django - Xadmin (四) Filter的更多相关文章

  1. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  2. 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置

    第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本  uwsgi- ...

  3. 第四百零一节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署virtualenv虚拟环境安装,与Python虚拟环境批量安装模块

    第四百零一节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署virtualenv虚拟环境安装,与Python虚拟环境批量安装模块 virtualenv简介 1.安装virtuale ...

  4. 第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1

    第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1 1.检查系统是否安装了python [root@192 ~]# rpm -qa ...

  5. 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明

    第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...

  6. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  7. Django+xadmin打造在线教育平台(二)

    三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...

  8. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

  9. 第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件

    第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 ag ...

随机推荐

  1. 关于mysql(Navicat premium软件中) 外键设置中“删除”和“更新”选项详解

    ON DELETE restrict(约束):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除. no action:意思同restrict.即如果存在从数 ...

  2. 【NOIP2016提高组A组7.16】大鱼海棠

    题目 椿是掌管海棠花的少女,她所在的世界不为人们所知,他们的天空就是人类的海底.生活在那个世界里的他们不是人,也不是鱼,而是其他人,掌管着人间的规律. 按照他们的习俗,在16岁那年,椿变为一条海豚到人 ...

  3. C#与.NET Framework c#编程语言,和java是一样的。(c#,java) -->javaweb,asp.net

  4. Oracle中的rowid rownum

    1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...

  5. php XDebug配置和使用

    已本机php 5.5nts为例,php.ini配置如下: [XDebug] xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.p ...

  6. CF889E Mod Mod Mod

    http://codeforces.com/problemset/problem/889/E 题解 首先我们观察到在每次取模的过程中一定会有一次的结果是\(a_i-1\),因为如果不是,我们可以调整, ...

  7. Spring Cloud教程(八)云原生应用程序

    Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样板模式, 使用Spring Clo ...

  8. js基础补漏

    1.for...in 和 for...of有何区别 for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称.一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性. ...

  9. 最简单的flask项目详解

    # 第一部分,初始化:所有的Flask都必须创建程序实例, # web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 # 程序实例是Flask的对象,一般情况下用如下方法实例化 # F ...

  10. win7下面安装flex和bison

    通过Cygwin工具进行安装 下载地址cygwin 安装截图: 搜索flex,选择相应的版本进行安装 搜索bison 然后下一步 安装完成后,将D:\cygwin64\bin路径添加到PATH环境变量 ...