我正在开发一个网站,每个网页上都有一堆页面,其中包含不确定数量的“应用”。像日历应用程序,随机图片应用程序或其他任何东西,每个都在一个整洁的小盒子里。虽然可以使用包含其他模板的一堆if标签编写模板,但这有点麻烦。我想传递一些变量并在其中一些应用程序上有表单,所以它会很快失控。编写自定义包含标记将优于{%include x%},但它仍然会包含很多if语句并为每个页面写出每个可能的应用程序。
有没有办法循环包含标签之类的东西,只包括相关的那些?我缺少的任何其他完全不同的解决方案?
我要避免的是,我使用{%include%}还是包含标签,是这样的:
{% if apps.calendar %}
{% include "calendar.html" %}
{% endif %}
{% if apps.pictures %}
{% include "pictures.html" %}
{% endif %}
这意味着我们必须在添加新应用时更新模板。会有什么好处的是:
{% for app in apps %}
{% call appropriate include or inclusion tag %}
{% endfor %}
答案 0 :(得分:1)
除了极少数例外,我们在整个地方都使用我们的自定义标记,因此我们只需将以下内容放在app/__init__.py
文件中即可解决此问题。
from django import template
template.add_to_builtins('content.templatetags.local_tags')
template.add_to_builtins('utils.cachetemplate')
因此,默认情况下,所有页面都可用。似乎没有影响性能,我们使用不太可能干扰我们include
其他内容的标记名称。这很懒,但确实有效。
更新:好的,我想我更了解你想要的东西。这样做的一种方法(虽然我并不是真的推荐它)是检查里面的变量包含的模板。这意味着您将始终拥有包含模板的开销,但它会使您的其他页面不那么混乱。
所以在主文件中不是这样的:
{% if apps.calendar %}
{% include "calendar.html" %}
{% endif %}
你只需要:
{% include "calendar.html" %}
并在“calendar.html”中有:
{% if apps.calendar %}
whatever you do for your calendar app
{% endif %}
更新2:
您显示的最后一段代码可以按如下方式完成。这利用了{% include arg %}
“解决”其论点的事实。这意味着它可以是变量或方法引用,它返回一个可用的字符串值,即模板名称。
{% for app in apps %}
{% include app %} <!-- or perhaps {% include app.template %} -->
{% endfor %}
注意:Django的模板代码无法正确处理顶级callables 。这意味着您的上下文无法传递对函数的引用,并且期望在模板中引用时调用它并将其输出插入。 IE浏览器。在上面的示例中,apps
列表可能不是您希望调用的简单函数。要按预期工作,函数引用必须是list
或dict
的成员,或者它必须是传递的对象的方法。我们Monkey很久以前就讨论过这个问题,因为我们在缓存的模板片段中使用curried functions
来推迟一些繁重的数据库工作。 This ticket已开放超过2年。