Django:DRY与逻辑分离有根本冲突吗?

时间:2010-11-19 02:50:53

标签: django django-templates dry django-context

这与此问题类似:How to use method parameters in a Django template?

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

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

假设我有一个用于面包屑导航的模板。我为每个导航层反复使用(通过包括)此模板。好又干。然而,我希望模板知道它所代表的导航的哪个迭代。

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

如果我是,如何在不违反逻辑分离原则的情况下保持此模板(和导航)DRY?

2 个答案:

答案 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。您也可以将宏放在同一个文件中,这样就不必导入了。