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实现中文输出的两种方法
May 09 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
django 常用orm操作详解
Sep 13 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
使用python采集Excel表中某一格数据
May 14 Python
Pycharm安装python库的方法
Nov 24 Python
Python: glob匹配文件的操作
Dec 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
建立文件交换功能的脚本(三)
2006/10/09 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
php解析xml方法实例详解
2015/05/12 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
python中pygame模块用法实例
2014/10/09 Python
Python 文件处理注意事项总结
2017/04/10 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
python实现两个文件合并功能
2018/04/01 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
大学生家政服务项目创业计划书
2014/01/30 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
物业经理自我鉴定
2014/03/03 职场文书
愚人节活动策划方案
2014/03/11 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python