在django中加入模板块标记

时间:2009-11-03 18:08:39

标签: django django-templates

是否有人编写了一个块模板标记,它将任意html片段与某些分隔符连接起来,其中省略了空项目?

对于渲染菜单式列表非常有用,其中显示的项目在运行时确定,要加入的项目需要精心标记。

感谢。

E.g:

{% joinitems using ' | ' %}

  {% if show_a %}
  <p>Some HTML here</p>
  {% endif %}    

{% separator %}

  {% if show_b %}
  <p>And some here</p>
  {% endif %}

{% endjoinitems %}

1 个答案:

答案 0 :(得分:1)

整整一小时都没有答案......不可接受。所以我自己把它放在一起。

class ItemSeparatorNode(template.Node):
    def __init__(self,separator):
        sep = separator.strip()
        if sep[0] == sep[-1] and sep[0] in ('\'','"'):
            sep = sep[1:-1]
        else:
            raise template.TemplateSyntaxError('separator in joinitems tag must be quoted')
        self.content = sep
    def render(self,context):
        return self.content

class JoinItemListNode(template.Node):
    def __init__(self,separator=ItemSeparatorNode("''"), items=()):
        self.separator = separator
        self.items = items
    def render(self,context):
        out = []
        empty_re = re.compile(r'^\s*$')
        for item in self.items:
            bit = item.render(context)
            if not empty_re.search(bit):
                out.append(bit)
        return self.separator.render(context).join(out)

@register.tag(name="joinitems")
def joinitems(parser,token):
    try:
        tagname,junk,sep_token = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("joinitems tag requires 'using \"separator html\"' parameters")
    if junk == 'using':
        sep_node = ItemSeparatorNode(sep_token)
    else:
        raise template.TemplateSyntaxError("joinitems tag requires 'using \"separator html\"' parameters")
    nodelist = []
    while True:
        nodelist.append(parser.parse(('separator','endjoinitems')))
        next = parser.next_token()
        if next.contents == 'endjoinitems':
            break

    return JoinItemListNode(separator=sep_node,items=nodelist)