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获取豆瓣电影简介代码分享
Jan 16 Python
Python中断言Assertion的一些改进方案
Oct 27 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python中元组,列表,字典的区别
May 21 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
windows下numpy下载与安装图文教程
Apr 02 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 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
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
python 系统调用的实例详解
2017/07/11 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python3爬取各类天气信息
2018/02/24 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
python中Lambda表达式详解
2019/11/20 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
优秀学生获奖感言
2014/02/15 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
爱国口号
2014/06/19 职场文书
商场消防安全责任书
2014/07/29 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技