这与此问题类似:How to use method parameters in a Django template?
我理解(并同意并欣赏)业务逻辑与表示逻辑分离的基本django哲学。
然而,有时它似乎使干燥更加困难,而干燥是一种更严重的做法,不是吗?
假设我有一个用于面包屑导航的模板。我为每个导航层反复使用(通过包括)此模板。好又干。然而,我希望模板知道它所代表的导航的哪个迭代。
我发誓我记得有一种方法可以做到这一点 - 比如{%include'llamas'html'| 2%}但我可能错了。
如果我是,如何在不违反逻辑分离原则的情况下保持此模板(和导航)DRY?
答案 0 :(得分:0)
您也可以从包含或内联面包屑代码的通用模板扩展而不是包含。
e.g。 sometemplate.html:
{% extends "base_with_breadcrumbs.html" %}
此外,如果你不想在某些页面上有面包屑,在“base_with_breadcrumbs.html”中你可以将面包屑包装成{%if with_crumbs%} ... {%endif%}语句。
在基本模板中,您可以定义可以在派生模板中填充的块。
另外,看看jinja2,它类似于django,但有许多不错的功能。我已经为我的项目在jinja中重写了50个模板,但从未回头。
答案 1 :(得分:0)
我的建议是切换到Jinja2。 include
标记大致相同,但您还有macro
标记,它为您提供了一个可调用的块,可以很容易地与变量一起使用。
包含标记的一些变体:
{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}
{% include ['page_detailed.html', 'page.html'] %}
{% include ['special_sidebar.html', 'sidebar.html'] ignore missing %}
使用宏,你可以做这样的事情:
{% macro input(name, value='', type='text') -%}
<input type="{{ type }}" value="{{ value|e }}" name="{{ name }}">
{%- endmacro %}
可以这样调用:
{% import 'forms.html' as forms %}
<dl>
<dt>Username</dt>
<dd>{{ forms.input('username') }}</dd>
<dt>Password</dt>
<dd>{{ forms.input('password', type='password') }}</dd>
</dl>
假设带有宏的文件是forms.html
。您也可以将宏放在同一个文件中,这样就不必导入了。