Django模板和DRY - 如何避免重复的HTML

时间:2014-04-03 15:26:24

标签: python django django-templates

我最近开始使用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)将条件嵌入checked属性中。

  • Pro:符合DRY标准
  • Con:使代码更难阅读,特别是如果条件更复杂并且操作了多个HTML元素属性

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

  • Pro:符合DRY标准
  • Con:将逻辑移至客户端

欢迎提出建议。

3 个答案:

答案 0 :(得分:2)

我认为该片段没有任何问题。它可能会破坏一些干,但代码最终是非常易读和可维护的。

Zen of Python的两个核心理念是

  

显式优于隐式

  

可读性计数

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

答案 1 :(得分:1)

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

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

正如您所看到的,此处无需复制代码 - 您可以在HTML中嵌入if语句以保存文本。

答案 2 :(得分:0)

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

创建一个伪字段,例如"checked"附加到您的每个商品,如果值为1,或者根据您的条件,将根据事实保留空字符串(不是None)或checked="checked"

你可以写:

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

这适用于DRY原则,它仍然是明确的。虽然这会转移到你的观点。