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将人民币转换大写的脚本代码
Feb 10 Python
Python实现远程调用MetaSploit的方法
Aug 22 Python
Python中的getopt函数使用详解
Jul 28 Python
python动态加载包的方法小结
Apr 18 Python
python如何定义带参数的装饰器
Mar 20 Python
关于python3中setup.py小概念解析
Aug 22 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
python实现逻辑回归的示例
Oct 09 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
Destoon实现多表查询示例
2014/08/21 PHP
php统计数组元素个数的方法
2015/07/02 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP children()函数讲解
2019/02/03 PHP
控制台报错object is not a function的解决方法
2014/08/24 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
Prototype框架详解
2015/11/25 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
理解javascript中的闭包
2017/01/11 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
Python常用小技巧总结
2015/06/01 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python @property原理解析和用法实例
2020/02/11 Python
Python os模块常用方法和属性总结
2020/02/20 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
结构工程个人自荐信范文
2013/11/30 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python