当前位置: 首页 > 编程笔记 >

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

孟华晖
2023-03-14
本文向大家介绍剖析Django中模版标签的解析与参数传递,包括了剖析Django中模版标签的解析与参数传递的使用技巧和注意事项,需要的朋友参考一下

分析直至另一个模板标签

模板标签可以像包含其它标签的块一样工作(想想 {% 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() 。

 类似资料:
  • 11.5. 剖析 基准测试(Benchmark)对于衡量特定操作的性能是有帮助的,但是当我们试图让程序跑的更快的时候,我们通常并不知道从哪里开始优化。每个码农都应该知道Donald Knuth在1974年的“Structured Programming with go to Statements”上所说的格言。虽然经常被解读为不重视性能的意思,但是从原文我们可以看到不同的含义: 毫无疑问,对效率的

  • 以下各节的脚本展示了如何通过监控函数调用来剖析(profile)内核活动。 统计函数调用次数 本节展示如何统计30秒内某个内核函数调用次数。通过使用通配符,你可以用这个脚本同时统计多个内核函数。 functioncallcount.stp #! /usr/bin/env stap # The following line command will probe all the functions #

  • PyCharm在我的Django项目中找不到模板、模板标签或静态文件,即使项目本身设置正确并正常工作。 我正在使用具有以下布局的Django: 以及如下设置: 更新: 在IDE首选项中,我已经配置了项目根目录的路径,< code>settings.py和< code>manage.py。此外,我已经配置了项目解释器(我现在从IDE运行runserver,没有任何问题)。

  • 代理模式定义 静态代理 代理模式的参与者 代理模式的实现思路 静态代理的实例 动态代理 JDK动态代理源码分析(JDK7) 代理对象是如何创建出来的? 是谁调用了Invoke? 参考文献 代理模式定义 维基百科上是这样描述代理模式的:所谓代理者是指一个类可以作为其他东西的接口。代理者可以作任何东西的接口, 例如网络连接,存储器中的大对象,文件或者其他无法复制的资源。 著名的代理模式的例子就是引用计

  • 问题内容: 我正在学习在python中同时使用该模块和该模块,并尝试编写一个简单的网络抓取工具。这是我编写的仅刮擦网站标题的代码: 这样可以为Google和Reddit提供正确的输出,但不能为Facebook提供正确的输出-像这样: 这是因为,我发现在Facebook页面上的标签如下:。为了适应额外的需求,我对变量进行了如下修改:。但这给出了以下输出: 如何将两者结合起来,以便考虑标记中传递的任何

  • 本文向大家介绍sqlserver数据库优化解析(图文剖析),包括了sqlserver数据库优化解析(图文剖析)的使用技巧和注意事项,需要的朋友参考一下 下面通过图文并茂的方式展示如下: 一、SQL Profiler  事件类 Stored Procedures\RPC:Completed TSQL\SQL:BatchCompleted 事件关键字段 EventSequence、EventClass