1

这类似于这个问题:如何在 Django 模板中使用方法参数?

我理解(并同意并欣赏)将业务逻辑与表示逻辑分离的基本 django 哲学。

然而,有时它似乎使 DRYness 变得更加困难,而 DRY 是一种更严重的做法,不是吗?

假设我有一个用于面包屑导航的模板。我为每个导航层反复使用(通过包含)这个模板。又好又干。但是我希望模板知道它代表的是导航的哪个迭代。

我发誓我记得有一种方法可以做到这一点——比如 {% include 'llamas'html' | 2 %} 但我可能错了。

如果我是,我怎样才能在不违反逻辑分离原则的情况下保持这个模板(和导航)干燥?

4

2 回答 2

0

除了包含之外,您还可以从包含或内联面包屑代码的通用模板进行扩展。

例如 sometemplate.html:

{% extends "base_with_breadcrumbs.html" %}

此外,如果您不想在某些页面上有面包屑,在“base_with_breadcrumbs.html”中,您可以将面包屑包装到 {% if with_crumbs %}...{% endif %} 语句中。

在基本模板中,您可以定义可以在派生模板中填充的块。

另外,看看 jinja2,它类似于 django,但有很多不错的功能。我已经为我的项目在 jinja 中重写了 50 多个模板,并且从未回头。

于 2010-11-19T02:58:43.143 回答
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. 您也可以将宏放在同一个文件中,这样您就不必导入了。

于 2010-11-19T03:06:22.757 回答