python - Django 中的模板标签

标签 python django

在 djangobook 中关于高级模板的第 9 章中,它展示了如何实现 {% 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() 后的函数 do_comment 中,解析器尚未“消耗”{% endcomment %} 标记,因此代码需要显式调用 parser.delete_first_token() 以防止该标记被处理两次。谁能解释一下这是什么意思。

最佳答案

Django doc说:

After parser.parse() is called, the parser hasn’t yet “consumed” the {% endcomment %} tag, so the code needs to explicitly call parser.delete_first_token().

官方文档(django 书中使用的)解释了为什么应该调用 parser.delete_first_token() 。但它并不能解释为什么解析器还没有“消耗”{% endcomment %}。我想这就是让你感到困惑的地方。

让我们以block标签为例。

因为我们可以选择为 endblock 标记节点命名,所以我们需要检查该名称是否与 block 标记节点中定义的名称匹配。

所以在大多数情况下我们可以简单地忽略 endxxx 标签节点,但在某些情况下,我们需要获取最后一个标签节点并做额外的事情。

@register.tag('block')
def do_block(parser, token):
    ...
    nodelist = parser.parse(('endblock',))

    # This check is kept for backwards-compatibility. See #3100.
    endblock = parser.next_token()
    acceptable_endblocks = ('endblock', 'endblock %s' % block_name)
    if endblock.contents not in acceptable_endblocks:
        parser.invalid_block_tag(endblock, 'endblock', acceptable_endblocks)

    return BlockNode(block_name, nodelist)

关于python - Django 中的模板标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21128206/

相关文章:

python - 从互联网下载文件并使用 Django 服务到网站而不暴露 URL

django - sorl-缩略图调整大小并添加背景

python - 使用 Selenium Python 打印特定的 Cookie

python - 如何使用Python和socket发送和接收?

django - 如何在 Django 中使用 Font-awesome 的星级?

django - 如何从 django admin 中的内联类实例访问 modeladmin 类实例

python - 将多个参数传递给一个函数?

python - 如何反转 sklearn.OneHotEncoder 变换以恢复原始数据?

python - PyDev 已安装但未显示在 ADT 中

python - Django AutoOneToOneField 迁移和现有条目