Django:DRY 与逻辑分离有根本冲突吗?
Posted
技术标签:
【中文标题】Django:DRY 与逻辑分离有根本冲突吗?【英文标题】:Django: Does DRY fundamentally conflict with logic separation? 【发布时间】:2011-05-12 10:10:27 【问题描述】:这类似于这个问题:How to use method parameters in a Django template?
我理解(并同意并欣赏)将业务逻辑与表示逻辑分离的基本 django 哲学。
但是,有时它似乎使 DRYness 变得更加困难,而 DRY 是一种更严重的做法,不是吗?
假设我有一个用于面包屑导航的模板。我为每个导航层反复使用(通过包含)这个模板。又好又干。但是我希望模板知道它代表的是导航的哪个迭代。
我发誓我记得有一种方法可以做到这一点 - 比如 % include 'llamas'html' | 2 % 但我可能错了。
如果我是,我怎样才能在不违反逻辑分离原则的情况下保持这个模板(和导航)DRY?
【问题讨论】:
【参考方案1】:除了包含之外,您还可以从包含或内联面包屑代码的通用模板进行扩展。
例如一些模板.html:
% extends "base_with_breadcrumbs.html" %
另外,如果您不想在某些页面上添加面包屑,可以在“base_with_breadcrumbs.html”中将面包屑包装成 % if with_crumbs %...% endif % 语句。
在基本模板中,您可以定义可以填充到派生模板中的块。
另外,看看 jinja2,它类似于 django,但有很多不错的功能。我已经为我的项目在 jinja 中重写了 50 多个模板,并且从未回头。
【讨论】:
【参考方案2】:我的建议是切换到 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
。您也可以将宏放在同一个文件中,这样您就不必导入了。
【讨论】:
但是,我又想知道 DRY 和逻辑分离之间的明显冲突。看起来这个解决方案将后者抛到了窗外。如果你能接受那没关系,但有没有更和平的和解方式? @Justin Myles Holmes:我使用这个解决方案是因为我认为 Django 本身没有一个干净的方法。您可以通过使用with
语句和include
语句来绕过它。但这只是一团糟……一旦你开始做超出extends
声明的事情,就会破坏所有可重用性。例如 Django 管理员,如果不定义自定义模板标签,您将无法更改呈现方式。以上是关于Django:DRY 与逻辑分离有根本冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章