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

 更新时间:2015年07月21日 09:09:34   投稿:goldensun  
这篇文章主要介绍了剖析Django中模版标签的解析与参数传递,Django是重多高人气Python框架中最为著名的一个,需要的朋友可以参考下

分析直至另一个模板标签

模板标签可以像包含其它标签的块一样工作(想想 {% if %} 、 {% for %} 等)。 要创建一个这样的模板标签,在你的编译函数中使用 parser.parse() 。

标准的 {% comment %} 标签是这样实现的:

def do_comment(parser, token):
  nodelist = parser.parse(('endcomment',))
  parser.delete_first_token()
  return CommentNode()

class CommentNode(template.Node):
  def render(self, context):
    return ''

parser.parse() 接收一个包含了需要分析的模板标签名的元组作为参数。 它返回一个django.template.NodeList实例,它是一个包含了所有Node对象的列表,这些对象是解析器在解析到任一元组中指定的标签之前遇到的内容.

因此在前面的例子中, nodelist 是在 {% comment %} 和 {% endcomment %} 之间所有节点的列表,不包括 {% comment %} 和 {% endcomment %} 自身。

在 parser.parse() 被调用之后,分析器还没有清除 {% endcomment %} 标签,因此代码需要显式地调用 parser.delete_first_token() 来防止该标签被处理两次。

之后 CommentNode.render() 只是简单地返回一个空字符串。 在 {% comment %} 和 {% endcomment %} 之间的所有内容都被忽略。
分析直至另外一个模板标签并保存内容

在前一个例子中, do_comment() 抛弃了{% comment %} 和 {% endcomment %} 之间的所有内容。当然也可以修改和利用下标签之间的这些内容。

例如,这个自定义模板标签{% upper %},它会把它自己和{% endupper %}之间的内容变成大写:

{% upper %}
  This will appear in uppercase, {{ user_name }}.
{% endupper %}

就像前面的例子一样,我们将使用 parser.parse() 。这次,我们将产生的 nodelist 传递给 Node :

def do_upper(parser, token):
  nodelist = parser.parse(('endupper',))
  parser.delete_first_token()
  return UpperNode(nodelist)

class UpperNode(template.Node):
  def __init__(self, nodelist):
    self.nodelist = nodelist

  def render(self, context):
    output = self.nodelist.render(context)
    return output.upper()

这里唯一的一个新概念是 UpperNode.render() 中的 self.nodelist.render(context) 。它对节点列表中的每个 Node 简单的调用 render() 。

相关文章

  • python 文件与目录操作

    python 文件与目录操作

    可以使用简单的方法匹配某个目录下的所有子目录或文件,用法也很简单。
    2008-12-12
  • python如何将图片转换素描画

    python如何将图片转换素描画

    这篇文章主要介绍了python如何将图片转换素描画,帮助大家更好的用python处理图片,感兴趣的朋友可以了解下
    2020-09-09
  • 教你编译pjsip源码的方法

    教你编译pjsip源码的方法

    通过本文教大家如何编译pjsip源码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10
  • pandas 实现将重复表格去重,并重新转换为表格的方法

    pandas 实现将重复表格去重,并重新转换为表格的方法

    下面小编就为大家分享一篇pandas 实现将重复表格去重,并重新转换为表格的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • pytorch SummaryWriter保存日志的方法

    pytorch SummaryWriter保存日志的方法

    这篇文章主要介绍了pytorch SummaryWriter保存日志的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • python直接获取API传递回来的参数方法

    python直接获取API传递回来的参数方法

    今天小编就为大家分享一篇python直接获取API传递回来的参数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python中函数eval和ast.literal_eval的区别详解

    Python中函数eval和ast.literal_eval的区别详解

    eval函数在Python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。那么eval和ast.literal_val()的区别是什么呢?本文将大家介绍关于Python中函数eval和ast.literal_eval区别的相关资料,需要的朋友可以参考下。
    2017-08-08
  • 使用python采集脚本之家电子书资源并自动下载到本地的实例脚本

    使用python采集脚本之家电子书资源并自动下载到本地的实例脚本

    这篇文章主要介绍了python采集jb51电子书资源并自动下载到本地实例教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • Django 日志配置按日期滚动的方法

    Django 日志配置按日期滚动的方法

    今天小编就为大家分享一篇Django 日志配置按日期滚动的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python基础教程之装饰器详解

    Python基础教程之装饰器详解

    众所周知,Python装饰器是一种常见的元编程特性,在本教程中,我们将深入探讨Python装饰器的基本概念、语法及其应用,并利用实际例子加深理解,感兴趣的小伙伴快跟随小编一起了解一下吧
    2023-06-06

最新评论