django 自定义过滤器(filter)处理较为复杂的变量方法


Posted in Python onAugust 12, 2019

简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能通过键值的方式取出原有数据,对象不能通过(.)的方式直接取出数据,通过大量地查阅资料,最终通过过滤器(filter)的方式解决!

1、需要传递到template的数据,在 views.py 中的index函数中

latest_article_list 是一个Article对象的列表,包含文章ID、作者、发布时间、分类等各种信息

dic['tag_list'] 为一个列表(文章标签列表)

articles_info是一个以字典为元素的列表,而且该字典中 键'article'对应的不是普通变量,而是一个Article对象

view.py

def index(request):
  latest_article_list = Article.objects.query_by_time()
  articles_info = []
  dic = {}
  for article in latest_article_list:
    taginfo = Article.objects.get(id=article.id)
    dic['tag_list'] = taginfo.tags.all()
    dic['article'] = article;
    articles_info.append(dic)
    dic = {}

  loginform = LoginForm()
  context = {'articles_info':articles_info, 'loginform':loginform}
  return render(request, 'index.html', context)

2、template如何引用views传递过来的变量值?

在index.html中,可以先遍历列表,得到每一个字典变量;

{% for article_info in articles_info %}

遍历 articles_info 之后的article_info 为一个字典,通过前面的views可以知道里面包含了一个article对象和一个tag_list列表;

对于article_info这个字典变量,在模板中却不能通过键值对获取对应的值,更别说获取Article对象中ID、作者、发布时间等属性值了,为了解决这一问题,这里就需要过滤器才能实现;

3、自定义过滤器

1)、在app目录下建立templagetags文件夹,在此目录下建立空文件 __init__.py和过滤器文件articleinfo.py;

2)、编辑 articleinfo.py,添加过滤器 get_key 和get_attr,get_key获取字典不同键对应的值,get_attr获取Article对象中不同字段对应的值;

articleinfo.py

from django import template
register = template.Library()

@register.filter
def get_key(d, key_name):
  return d.get(key_name)

@register.filter
def get_attr(d, m):
  if hasattr(d, m):
    return getattr(d, m)

4、模板中使用过滤器,获取各种变量值;

index.html中,首先需要通过标签加载上面定义的过滤器文件 articleinfo.py,然后就是index.html模板中调用过滤器了,具体的使用方法见下面的index.html文件;

{% load articleinfo %}

下面的index.html中变量使用的部分代码,使用了双重过滤器提取出了所需要的变量;

比如第4行中

{{ article_info|get_key:"article"|get_attr:"id" }}

首先通过 article_info|get_key:"article" 获取到字典中的article对象,但此处需要的是article对象中的ID属性,由于并不能通过{{ article_info|get_key:"article".id }} 获取到对应的ID值,所以只好双重过滤器来实现了。

index.html

{% for article_info in articles_info %}
  <div class="row">
    <article class="col-xs-12">
      <h3><a id="article_title", href="/focus/{{ article_info|get_key:" rel="external nofollow" article"|get_attr:"id" }}">{{ article_info|get_key:"article"|get_attr:"title" }}</a></h3>
      <div class="article_info">
        <span class="">{{ article_info|get_key:"article"|get_attr:"author" }}</span>
        <span class="">{{ article_info|get_key:"article"|get_attr:"create_time"|date:"Y-m-d H:i" }}</span>
      </div>
      <div class="category">
        分类:
         <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class>{{ article_info|get_key:"article"|get_attr:"category" }}</a>
      </div>
      <div class="category">
        标签:
        {% for tag in article_info|get_key:"tag_list" %}
          <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ tag }}</a>
        {% endfor %}
      </div>
      <p>{{ article_info|get_key:"article"|get_attr:"content"|truncatechars_html:80 | safe }}</p>
      <p><button class="btn btn-default" onclick="window.location.href='/focus/{{ article_info|get_key:"article"|get_attr:"id" }}' ">Read More</button></p>
      <ul class="list-inline">
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-comment"></span>{{ article_info|get_key:"article"|get_attr:"comment_num" }} Comments</a></li>
        <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-thumbs-up"></span>{{ article_info|get_key:"article"|get_attr:"like_num" }} Likes</a></li>
      </ul>
    </article>
  </div>      
  <hr>
{% endfor %}

以上这篇django 自定义过滤器(filter)处理较为复杂的变量方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python读取mp3中ID3信息的方法
Mar 05 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
python 内置函数汇总详解
Sep 16 Python
pygame实现弹球游戏
Apr 14 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 Python
django-filter和普通查询的例子
Aug 12 #Python
利用python实现汉字转拼音的2种方法
Aug 12 #Python
python面向对象 反射原理解析
Aug 12 #Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 #Python
Django 查询数据库并返回页面的例子
Aug 12 #Python
python3 深浅copy对比详解
Aug 12 #Python
Django获取该数据的上一条和下一条方法
Aug 12 #Python
You might like
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php 数组的一个悲剧?
2011/05/11 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
微信支付的开发流程详解
2016/09/13 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
单位创先争优活动方案
2014/01/26 职场文书
综治宣传月活动总结
2014/04/28 职场文书
给学校的建议书范文
2014/05/15 职场文书
社区灵活就业证明
2014/11/03 职场文书
介绍信范文大全
2015/05/07 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript