django 自定义标签内联或块

Posted

技术标签:

【中文标题】django 自定义标签内联或块【英文标题】:django custom tag inline or block 【发布时间】:2012-03-08 01:01:46 【问题描述】:

我想知道是否有办法检查标签是否有结束块。我基本上是想让用户这样做

% mytag 'a' 'b' 'c' %

% mytag 'a' 'b' 'c' %
    <!-- other markup here -->
% end mytag %

我看到如果它不存在它会引发异常,但是有没有办法以编程方式设置我的标签以安全地处理这两种情况?

【问题讨论】:

【参考方案1】:

您可以尝试解析直到结束标记,如果未找到则捕获异常。如果您还遇到另一个 mytag 节点,您可能想要停止:

def do_mytag_stuff(parser, token):

    # Process your token however you need
    mytag_args = token.split_contents()

    try:
        nodelist = parser.parse(('endmytag', 'mytag'))
        token = parser.next_token()
        if token.contents == 'endmytag':
            # Found an ending tag, make a node for its contents
            parser.delete_first_token()
            return MyTagNode(nodelist, mytag_args)

    except TemplateSyntaxError:
        # Neither tag was found
        pass

    # So either there's no closing tag, or we met another mytag before a closing tag. 
    # Do whatever you would for a single tag here
    return SingleMyTagNode(mytag_args)

不确定这是否 100% 正确,但希望它会有所帮助。

【讨论】:

我想我唯一担心的是这可能会掩盖其他问题。就像人们没有正确输入内容一样,包括 DNE 的模板等。 非常正确,我认为只有两个相似的标签会更干净。 这实际上可能是一个更好的解决方案,他们可以共享逻辑,所以它只是一个门面。 我接受了,但我认为更好的解决方案是公开两个标签更改 except 以检查“预期的 endmytag 或我的标签”。它会阻止我们隐藏与我的标签无关的编译异常。

以上是关于django 自定义标签内联或块的主要内容,如果未能解决你的问题,请参考以下文章

在自定义模板标签中解析 Django 自定义模板标签

Django:如何查看已定义的自定义标签?

自定义 Django 标签和 jQuery

Django(自定义过滤器和自定义标签)

Django的自定义标签

django自定义模板标签和过滤器