<p>我也遇到过同样的问题,在看了你的问题后,我设法做到了。希望这能帮助其他人。在</p>
<p>我正在我的项目中使用<a href="http://django-classy-tags.readthedocs.org/" rel="nofollow">classy-tags</a>,我强烈推荐它。如果您只打算使用一次,那么代码可能很简单。因为我的目的是要有不同种类的面板,所以我使它有点通用。在</p>
<pre><code># templatetags/modals.py
from classytags.core import Tag, Options
from classytags.arguments import Argument, MultiKeywordArgument
from django import template
register = template.Library()
class BasePanel(Tag):
def render_tag(self, context, **kwargs):
nodelist = kwargs.pop('nodelist')
body = nodelist.render(context)
panel_context = self.get_panel_context(kwargs)
panel_context['body'] = body
t = template.loader.get_template(self.template)
c = template.Context(kwargs)
return t.render(c)
def get_panel_context(self, arguments):
"""
Override this method if you're using fancy arguments,
e.g: MultiKeywordArgument
"""
return arguments
class ExamplePanel(BasePanel):
name = 'panel'
template = 'main/modals/panel.html'
options = Options(
Argument('title'),
MultiKeywordArgument('kw', required=False),
blocks=[('endpanel', 'nodelist')],
)
def get_panel_context(self, arguments):
kw = arguments.pop('kw')
arguments['state'] = kw.get('state', 'default')
return arguments
register.tag(ExamplePanel)
</code></pre>
<p>模板如下:</p>
^{2}$
<p>下面是如何使用它:</p>
<pre><code>{% panel "First Title" state="primary" %}
<p>Hello World!</p>
{% endpanel %}
{% panel "Another Title" %}
<p>Hello World!</p>
{% endpanel %}
</code></pre>
<p>这可以通过使用<a href="http://jinja.pocoo.org/docs/dev/templates/#call" rel="nofollow">Jinja2 Macros</a>轻松完成。希望django1.8将带来本地Jinja2支持。在</p>