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

2 投票
3 回答
1011 浏览
提问于 2025-04-18 01:11

我最近开始使用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属性里。

  • 优点:符合DRY原则
  • 缺点:代码可读性下降,特别是当条件比较复杂,且需要操作多个HTML元素的属性时

2) 使用模板变量的值定义JavaScript变量,然后用JavaScript生成HTML元素。

  • 优点:符合DRY原则
  • 缺点:把逻辑转移到了客户端

欢迎大家提出建议。

3 个回答

0

作为第三种选择,你可以通过你的视图来控制 checked="checked" 这一部分。

你可以创建一个伪字段,比如叫 "checked",这个字段会和你每个项目关联,里面会存放一个空字符串(不是 None),或者根据某个条件(比如值是否为1)存放 checked="checked"

这样你就可以写:

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

这符合DRY原则,而且依然很明确。虽然这些逻辑会转移到你的视图中。

1

在你的例子中,其实可以把事情简化很多(见下面的代码):

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

你可以看到,这里不需要重复写代码——你可以把if语句放在HTML里面,这样可以节省一些文字。

2

我觉得这段代码没有什么问题。虽然可能会有点违反“不要重复自己”的原则,但整体来说,这段代码还是很容易读懂和维护的。

Python的哲学中,有两个核心理念:

明确比隐含要好

还有

可读性很重要

通过JavaScript生成HTML的方式确实不够明确,而在一个元素里面放条件会影响代码的可读性。

撰写回答