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. 【python】对于程序员来说,2018刑侦科推理试卷是问题么?

    最近网上很火的2018刑侦科推理试卷,题目确实很考验人逻辑思维能力. 可是对于程序员来说,这根本不是问题.写个程序用穷举法计算一遍即可,太简单. import itertools class Solu ...

  2. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra

    题目链接 第一眼就是 $KDtree$ 优化建图然而,空间只有 $128mb$,开不下   时间不吃紧,考虑直接跑 $Dijkstra$ $Dijkstra$ 中存储的是起点到每个输入时给出的矩阵的最 ...

  3. HDU 6616 Divide the Stones

    目录 题面 中文题意 比赛惨状 我的走不通的思路 \(m\)是偶数的情况 \(m\)是奇数的情况 题解的思路 另一些思路 源代码 题面 Time limit 3000 ms Memory limit ...

  4. Beauty Values

    Beauty Values 题意:给$n$个数, 定义它的Beauty Values为所有连续子区间的(区间长度*区间内不同数字的数目)求和 求Beauty Values A[i]数组表示数字i最近一 ...

  5. 网页分页page

    public class PageBean { private int page; // 第几页 private int pageSize; // 每页记录数 private int start; / ...

  6. Python 学习笔记(基础语法 restful 、 Flask 和 Requests)

    input 函数 #!/usr/bin/env python3 name = input("\n\n按下 enter 键后退出.") print(name) print() 在 p ...

  7. VS 2010内存泄漏检测

    控制台程序在启动时调用 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 程序正常退出后会打印内存泄漏信息. MFC程序不用 ...

  8. Ubuntu启动 卡在checking battery state 解决方案

    Ubuntu启动,卡在checking battery statALT + F1或者CTRL+ALT+F6切换到命令行[CTRL+ALT+F7返回界面]执行 sudo gdm start后就可以正常登 ...

  9. URL里的分号';'一定要编码为%3b!!!!

    http://en.wikipedia.org/wiki/Query_string The series of pairs is separated by the ampersand, '&' ...

  10. MyEclipse/Eclipse启动时workspace不提示,解决办法

    右键MyEclipse/Eclipse的快捷方式,选择属性(属性->快捷方式->目标),在目标的最后面加上" -clean",如:"D:\Myeclipse8 ...