【问题标题】:Django templates and DRY - how to avoid duplicated HTMLDjango 模板和 DRY - 如何避免重复的 HTML
【发布时间】:2014-05-15 13:13:33
【问题描述】:

我最近开始使用 Django 模板,经常在别人的代码中发现以下模式:

  {% ifequal value 1 %}
      <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" checked="checked" />
  {% else %}
      <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}"  />

带有 Django 模板变量的条件用于定义一个或多个 HTML 元素属性的值。这会复制 HTML 代码并破坏 DRY 原则。我该如何避免呢?

我考虑过的替代方案:

1) 将条件嵌入到选中的属性中。

  • 专业版:符合 DRY 标准
  • 缺点:使代码更难阅读,特别是在条件更复杂并且操作了多个 HTML 元素属性的情况下

2) 使用模板变量值定义 Javascript 变量,并使用 Javascript 生成 HTML 元素。

  • 专业版:符合 DRY 标准
  • 骗局:将逻辑移至客户端

欢迎提出建议。

【问题讨论】:

  • 解决这个问题的真正方法当然是使用 Django 的表单框架。

标签: python django django-templates


【解决方案1】:

我不认为sn-p有什么问题。它可能会破坏一些 DRY,但代码最终是非常可读和可维护的。

Zen of Python 的两个核心理念是

显式优于隐式

可读性很重要

通过 JavaScript 生成 HTML 绝对不是显式的,而在元素中放置条件会影响可读性。

【讨论】:

    【解决方案2】:

    在您的示例中,您可以简化一些事情(见下文):

    <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" {% ifequal value 1 %}checked="checked"{% endif %} />
    

    如您所见,此处无需复制代码——您可以在 HTML 中嵌入 if 语句来保存文本。

    【讨论】:

    • 这是我在问题中提到的替代方案 1
    【解决方案3】:

    作为第三个选项,您可以使用您的视图来控制checked="checked" 部分。

    创建一个名为 e.g. 的伪字段"checked" 附加到您的每个项目上,并将根据值是否为 1 或您的条件将包含空字符串(不是 None)或 checked="checked"

    你将允许你写:

    <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" {{ item.checked }}  />
    

    这适用于 DRY 原则,它仍然是明确的。尽管这将转移到您的视野中。

    【讨论】:

    • 但是 UI 细节由后端处理,这不好恕我直言。
    • 我愿意同意艾伦,因为我知道你来自哪里。但是,我想引用 Django 文档:“视图本身包含返回该响应所需的任意逻辑。”所以它基本上说,你可以把这个逻辑放在你的视图或你的模板中。因此,您需要决定什么更适合或整体设计。我并不是说模板内处理是错误的。它只是...取决于...
    猜你喜欢
    • 2017-08-05
    • 2019-01-29
    • 2013-06-17
    • 1970-01-01
    • 2016-12-09
    • 2015-02-19
    • 2011-08-02
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多