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 相关文章推荐
pymongo给mongodb创建索引的简单实现方法
May 06 Python
Python字符串格式化的方法(两种)
Sep 19 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python理解递归的方法总结
Jan 28 Python
Django的models中on_delete参数详解
Jul 16 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
python使用 request 发送表单数据操作示例
Sep 25 Python
wxpython布局的实现方法
Nov 01 Python
Python实现AI换脸功能
Apr 10 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
May 26 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
Python实现把数字转换成中文
2015/06/29 Python
基python实现多线程网页爬虫
2015/09/06 Python
如何基于python操作json文件获取内容
2019/12/24 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
24个canvas基础知识小结
2014/12/17 HTML / CSS
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
授权委托书协议书
2014/10/16 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js