django框架自定义模板标签(template tag)操作示例


Posted in Python onJune 24, 2019

本文实例讲述了django框架自定义模板标签(template tag)操作。分享给大家供大家参考,具体如下:

django 提供了丰富的模板标签(template tag)和过滤器(tempalte filter),但这些并非完全能满足自己的需要,所以django 也提供了自定义模板标签和filter. 自定义这些标签其实很简单,用一个方法举例,今天有一个需要在页面中计算几个数的乘积的需求,比如 订单数量*订单价格*商品折扣.

也许有人会说,可以在view中先计算好,然后再显示在界面上,当然,这样做是可以的。对于比较方便的,确实可以在view中就计算好,如果不方便的,有的数据需要组合,拼凑的,也未必方便。所以试着写如下一个计算乘积的tag:

#coding:utf-8
'''
Created on 2012-12-19
@author: yihaomen.com
计算多个数的乘积
'''
from django import template
from django.template.base import resolve_variable, Node, TemplateSyntaxError
register = template.Library()
class MulTag(Node):
  def __init__(self,numList):
    self.numList = numList
  def render(self, context):
    realList = []
    try:
      for numobj in self.numList:
        realList.append(numobj.resolve(context))
    except:
      raise TemplateSyntaxError("multag error")
    try:
      value = realList[0]
      for num in realList[1:]:
        value = value* num
      return round(value,2)
    except:
      return ''
@register.tag(name="mymul")
def getMulNums(parser, token):
  bits = token.contents.split()
  realList = [parser.compile_filter(x) for x in bits[1:]]
  return MulTag(realList)

基本上所有的django template tag 都是这种写法,这里需要注意的是

1. 在 getMulNums 方法里的 parser.compile_filter 这个非常重要。

2. 在Multag 中的 numobj.resolve(context)

有了以上的方法,才能正确得到模板中上下文的内容,否则你只能写死内容 ({%mymul 3 4 5 6%} 这种方式)

比如,在视图view的context中有 order ,item,对象 在模板中有如下计算

{% load myMulTag %}
{%mymul order.num item.price item.discount%}

这样就能计算出值来,无论多少个相乘,都可以得到结果.

另外还有一点要注意的就是 自己写的template tag ,一定要保存在app下的 templatetags 目录下. 否则加载不成功.

这个写django template tag的方式,具有代表性,其他的tag可以用类似的方法写出来,写成自己需要的业务规则就可以,接收的参数类型不同而已。

参考资料:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
python字典的常用方法总结
Jul 31 Python
你可能不知道的Python 技巧小结
Jan 29 Python
Python列表如何更新值
May 27 Python
基于python实现破解滑动验证码过程解析
May 28 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 #Python
Python 循环终止语句的三种方法小结
Jun 24 #Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 #Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 #Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 #Python
python对文件目录的操作方法实例总结
Jun 24 #Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 #Python
You might like
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue实现一个炫酷的日历组件
2018/10/08 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
django 发送手机验证码的示例代码
2018/04/25 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
python反扒机制的5种解决方法
2021/02/06 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
Linux如何为某个操作添加别名
2013/03/01 面试题
体育系毕业生自荐信
2014/06/28 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android