Django 模板与 DRY - 如何避免重复 HTML
我最近开始使用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的方式确实不够明确,而在一个元素里面放条件会影响代码的可读性。