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给文本创立向量空间模型的教程
Apr 23 Python
详解Python中heapq模块的用法
Jun 28 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
利用python实现数据分析
Jan 11 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
深入了解Django中间件及其方法
Jul 26 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
快速开发一个PHP扩展图文教程
2008/12/12 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
Python中__new__与__init__方法的区别详解
2015/05/04 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
Python单元测试实例详解
2018/05/25 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
vue router 动态路由清除方式
2022/05/25 Vue.js
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers