我正在尝试使用我的Django模板进行干燥,并且有一些代码可以与CSS混合用于简单的悬停弹出窗口。我想重用代码,但我的弹出窗口的内容将是HTML,可能跨越多行。是否可以将多行字符串填充到模板变量中?
我尝试用块和block.super
做一些时髦的事情,但这似乎只在扩展时起作用(不是include
)
以下是我想做的一个例子。有可能吗?
index.html
<body>
<h2>My Popup</h2>
{% include "snippets/popup.html" with class="p" spantext="Hover me" popupdiv="""
<h2>This is a popup!</h2>
<ul>
<li>Something</li>
<li>Something else</li>
</ul>
"""
%}
</body>
snippets/popup.html
<div class="{{ class }}">
<span class='pointer'>{{ spantext }}</span>
<div class="popup">
{{ popupdiv }}
</div>
</div>
我知道在Django中不可能有多行模板标签,但除了将我的所有div html压缩到一行并转出任何引号之外,还有什么办法吗?
干杯
答案 0 :(得分:2)
事实证明“解析直到另一个模板标签”就是我所追求的。 http://www.djangobook.com/en/2.0/chapter09.html
这是我的代码:
tags.py
(在templatetags
文件夹中)
from django import template
from django.template.loader import get_template
from django.template.base import Node, TemplateSyntaxError
register = template.Library()
class PopupNode(Node):
def __init__(self, nodelist, class_name, spantext):
self.nodelist = nodelist
self.class_name = class_name
self.spantext = spantext
def render(self, context):
popup_html = get_template("ordersystem/snippets/popup.html")
context.update({
'class' : self.class_name,
'spantext' : self.spantext,
'popupdiv' : self.nodelist.render(context)
})
return popup_html.render(context)
@register.tag('popup')
def show_popup(parser, token):
nodelist = parser.parse(('endpopup',))
tokens = token.split_contents()
if len(tokens) != 4:
raise TemplateSyntaxError("show_popup is in the format 'popup with class=X spantext=Y")
try:
context_extras = [t.split("=")[1].strip('"') for t in tokens[2:]]
except IndexError:
raise TemplateSyntaxError("show_popup is in the format 'popup with class=X spantext=Y")
parser.delete_first_token()
return PopupNode(nodelist, *context_extras)
然后在我的html文件中,我可以这样做:
{% popup with class_name=management spantext=Manage %}
<h2>This is a popup!</h2>
<ul>
<li>Something</li>
<li>Something else</li>
</ul>
{% endpoup %}
答案 1 :(得分:-1)
最好的方法是在模块中使用包含标记创建模板标记。
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
想象一下你的YourModule你的模块有一个文件夹templatetags和文件 popup_tag.py
yourModule/
---- views.py
---- models.py
---- templates/
---- snippet/
---- popup.html
---- templatetags/
---- __init__.py
---- popup_tag.py
您的 popup_tag.py 可能如下所示:
from django import template
register = template.Library()
def show_pop_up(class, span_text, popupdiv):
return {'class': class,
'span_text': span_text,
'pop_up_div': pop_up_div}
register.inclusion_tag('snippet/popup.html')(show_popup)
然后,您只需在模板 index.html 中调用您的代码。
{% load popup_tag %}
{% show_popup "class" "span_text" "popupdiv" %}