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. 运行biggan demo

    http://www.zhuanzhi.ai/document/8705953a704e1bf8e051c161d1587d88

  2. nginx限制文件访问速率

    需求: 一个文件下载功能需要限制文件同时访问的并发数和当个连接的访问速率: 配置: 在http context内增加: limit_conn_zone $binary_remote_addr zone ...

  3. dnsmasq+Stunnel+sniproxy加密代理

    一.环境介绍 [root@kimissVPN ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@kimissVPN ~]# un ...

  4. Spring boot @Transactional

    1.注解@Transactional 2.异常回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @Ov ...

  5. eclipse jshint安装

    http://www.cnblogs.com/lhb25/archive/2012/04/05/javascript-validation-with-jshint-eclipse.html

  6. anaconda 下载包速度慢

    更新清华镜像资源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda ...

  7. TCP报文段首部格式详解

    TCP首部格式   格式字段详解   源端口.目标端口: 计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两 ...

  8. Oracle Flashback Drop

    Ensure that the prerequisites described in Prerequisites of Flashback Drop are met. The following li ...

  9. MySQL的常用JSON函数

    1. JSON_SEARCH(col ->> '$[*].key', type, val) col: JSON格式的字段名 key:要搜索的col字段的key type:可以为'one'或 ...

  10. VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二

    目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_Open 打开 VMDK File VixDiskLib_Read 读取 VMDK File 数据 VixDiskLib_ ...