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 与逻辑分离有根本冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章

[编织消息框架]数值与逻辑分离

PyQt5 - 将逻辑与 ui 分离导致功能无法正常工作

Django简介

设计原则之DRY原则

探秘SpringAop_介绍以及使用详解

Django简介