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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Python的Django框架中自定义模版标签的示例

    为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程. 当Django编译一个模板时,它将原始模板分成一个个 节点 .每个节点都是 django.template.Node 的一个实例,并且具备 render() 方法. 于是,一个已编译的模板就是 节点 对象的一个列表. 例如,看看这个模板: Hello, {{ person.name }}. {% ifequal name.birthday today %} Happy birthday! {% else %} Be

  • 浅谈Django自定义模板标签template_tags的用处

    自定义模板标签,过滤器.英文翻译是Customtemplatetagsandfilters.customfilter自定义过滤器今天不在我的记录范围之内,以后用到再看官方文档也不迟. **问题1:**customtemplatetags到底长啥样? customtemplatetags-github Manytemplatetagstakeanumberofarguments–stringsortemplatevariables–andreturnaresultafterdoingsomepro

  • Django中模版的子目录与include标签的使用方法

    get_template()中使用子目录 把所有的模板都存放在一个目录下可能会让事情变得难以掌控. 你可能会考虑把模板存放在你模板目录的子目录中,这非常好. 事实上,我们推荐这样做:一些Django的高级特性(例如将在第十一章讲到的通用视图系统)的缺省约定就是期望使用这种模板布局. 把模板存放于模板目录的子目录中是件很轻松的事情. 只需在调用 get_template() 时,把子目录名和一条斜杠添加到模板名称之前,如: t = get_template('dateapp/current_dat

  • Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】

    本文实例讲述了Django框架模板语言.分享给大家供大家参考,具体如下: 模板语言 模板语言简称为DTL(Django Template Language) 模板变量 模板变量名由数字,字母,下划线和点组成,不能以下划线开头. 使用:{{模板变量名}} def index2(request): '''模板加载顺序''' return render(request, 'booktest/index2.html') # /temp_var def temp_var(request): '''模板变量

  • 详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)

    Django项目中模板标签及模板的继承与引用 常见模板标签 {% static %} {% for x in range(x) %}{% endfor %} 循环的序号{% forloop %} 循环的序号反向排列,从1开始计算,从0开始计算在后面加上0{% forloop.revcounter0 %} {% if condition1 %}sentence1{% else condition2 %}sentence2{% endif %} 模板标签url反向解析 视图函数 def studen

  • 在Django中编写模版节点及注册标签的方法

    编写模板节点 编写自定义标签的第二步就是定义一个拥有 render() 方法的 Node 子类. 继续前面的例子,我们需要定义 CurrentTimeNode : import datetime class CurrentTimeNode(template.Node): def __init__(self, format_string): self.format_string = str(format_string) def render(self, context): now = dateti

  • 在django中使用自定义标签实现分页功能

    效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本例中总页数为30页,显示页数为12页,当前页的前排页数为4,后排页数为5 将分页分为三种情况: 1   当前页为第1页到第7页的时候,无省略页,且12个位置的内容是不变 2  当前页为第8页到第25页时,位置1与位置2内容不变,当前页一直处于位置7, 3  当前页为第25页到第30页时,位置1与位置

  • 剖析Django中模版标签的解析与参数传递

    分析直至另一个模板标签 模板标签可以像包含其它标签的块一样工作(想想 {% if %} . {% for %} 等). 要创建一个这样的模板标签,在你的编译函数中使用 parser.parse() . 标准的 {% comment %} 标签是这样实现的: def do_comment(parser, token): nodelist = parser.parse(('endcomment',)) parser.delete_first_token() return CommentNode()

  • Django模板继承 extend标签实例代码详解

    在 views.py 上修改 ... def ordered(req): return render(req, "ordered.html") def shopping_car(req): return render(req, "shopping_car.html") 在 urls.py 上修改 ... path('ordered/', views.ordered), path('shopping_car/', views.shopping_car), ... 在

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

    本文实例讲述了django框架自定义模板标签(template tag)操作.分享给大家供大家参考,具体如下: django 提供了丰富的模板标签(template tag)和过滤器(tempalte filter),但这些并非完全能满足自己的需要,所以django 也提供了自定义模板标签和filter. 自定义这些标签其实很简单,用一个方法举例,今天有一个需要在页面中计算几个数的乘积的需求,比如 订单数量*订单价格*商品折扣. 也许有人会说,可以在view中先计算好,然后再显示在界面上,当然,

  • Django框架基础模板标签与filter使用方法详解

    本文实例讲述了Django框架基础模板标签与filter使用方法.分享给大家供大家参考,具体如下: 一.基本的模板语言 1.变量 {{ }} 1.1.进入Django shell 环境 python manage.py shell 1.2.Context.Template 模块的基本使用 from django.template import Context,Template t = Template('My name id {{ name }}') c = Context({'name':'S

  • Yii2框架自定义类统一处理url操作示例

    本文实例讲述了Yii2框架自定义类统一处理url操作.分享给大家供大家参考,具体如下: 因为每个人写url的方式不一样,导致我们后期如果对url有修改的话,就非常麻烦. 所以我们需要来统一管理,同时还可以规范书写. 1.新建services\UrlService.php,services 是我们自定义的目录,专门用来写我们的各种自定义服务. <?php namespace app\services; use yii\helpers\Url; /** * 统一管理链接,并规范书写 * Class

  • Django框架首页和登录页分离操作示例

    本文实例讲述了Django框架首页和登录页分离操作.分享给大家供大家参考,具体如下: 1.登录模板login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户登录</title> </head> <body> <form method="post&qu

  • Laravel框架自定义公共函数的引入操作示例

    本文实例讲述了Laravel框架自定义公共函数的引入操作.分享给大家供大家参考,具体如下: 背景 习惯了 使用 ThinkPHP 框架,有一个公共方法类在代码编写上会快捷很多,所以有必要在此进行配置一番. 测试框架:Laravel 5.5 步骤指导 1. 创建 functions.php 在 app/Helpers/(目录可以自己随便来)下新建一个文件 functions.php,在内部补充如下代码: <?php /** * Created by PhpStorm. * User: moTzxx

  • django框架F&Q 聚合与分组操作示例

    本文实例讲述了django框架F&Q 聚合与分组操作.分享给大家供大家参考,具体如下: F 使用查询条件的值,专门取对象中某列值的操作,可以对同一个表中的两个列进行比较 from django.db.models import F ret=models.Book.objects.filter(count__lt=F('sale')).values() #查找 列 count < sale的数据 for i in ret: print(i) models.Book.objects.filter

  • Python Django框架实现应用添加logging日志操作示例

    本文实例讲述了Python Django框架实现应用添加logging日志.分享给大家供大家参考,具体如下: Django uses Python's builtin logging module to perform system logging. Django使用python的内建日志模块来记录系统日志,但是要想在django应用中开启此功能使我们的部分操作能够被记录到日志文件,那么就需要进行一定的配置并且根据具体的log类型来进行调用 step 1:配置setting.py 以下配置除了f

  • django框架基于模板 生成 excel(xls) 文件操作示例

    本文实例讲述了django框架基于模板 生成 excel(xls) 文件操作.分享给大家供大家参考,具体如下: 生成Excel 文件,很多人会采用一些开源的库来实现,比如python 自带 csv 库可以生成类似Excel  一样的东西,当然还有一些专门处理 excel 的库,我以前也有用过,比如这里: //www.jb51.net/article/163408.htm 我介绍过用第三方的库来实现.但事实上还有另外一种办法,采用模板的方法. 虽然标题写的是利用 django 模板来实现,其实并一

  • django自定义模板标签过程解析

    这篇文章主要介绍了django自定义模板标签过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码布局 自定义模板标签必须位于django的某个应用中 该应用中新建templatetags目录,和models.py,views.py同一级别 结构如下: polls/ __init__.py models.py templatetags/ __init__.py poll_extras.py views.py 模板中调用标签: {% loa

随机推荐