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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
python使用win32com在百度空间插入html元素示例
Feb 20 Python
python3访问sina首页中文的处理方法
Feb 24 Python
python实现聚类算法原理
Feb 12 Python
tensorflow实现加载mnist数据集
Sep 08 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python实现在一个画布上画多个子图
Jan 19 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
python中编写函数并调用的知识点总结
Jan 13 Python
Python Matplotlib绘制条形图的全过程
Oct 24 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
PHP进程同步代码实例
2015/02/12 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
Jquery技巧(必须掌握)
2016/03/16 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
python检测远程端口是否打开的方法
2015/03/14 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Pandas中resample方法详解
2019/07/02 Python
Python 的AES加密与解密实现
2019/07/09 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
入股协议书范本
2014/11/01 职场文书
幼儿学前班评语
2014/12/29 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python