是否有人编写了一个块模板标记,它将任意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 %}
答案 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)