在django,我应该更喜欢哪个,为什么?
长模板变量名称,尽可能少地传递“根对象”(例如请求):
{% if request.current_page.get_children.0.get_absolute_url %}
或传递了许多不同的“根对象”并保持模板变量名称简单:
{% if first_child_url %}
在中间的某个地方,例如通过children
{% if children.0.get_absolute_url %}
或传递first_child
{% if first_child.get_absolute_url %}
第一种方法的优点是更松散的耦合,因为每次我需要使用另一个变量时我都不需要改变视图;第二种方法的优点是模板更简单,更清洁。
如果我使用的通用视图(或第三方视图)不允许我添加其他上下文变量(因此添加上下文变量的唯一方法是编写中间件或上下文处理器),这会改变什么吗? / p>
答案 0 :(得分:2)
如果你是唯一的开发者,那主要是品味问题。但是,如果编写视图的人不是编写模板的人,那么在视图和模板之间配合明确定义的“契约”要容易得多。
我倾向于将视图的参数视为模板,就像我考虑API接口一样。我的网站逻辑可以改变,但只要我尊重传递给模板的数据结构,我就不需要重写任何东西 - 当在一个小组中工作时,这是至关重要的。
答案 1 :(得分:2)
对此没有正确答案,但我可以给你一些其他的考虑:
1)模板中的错误变量名称将无声地失败,这就是为什么我通常会尝试避免像
这样的事情{% if request.current_page.get_children.0.get_absolute_url %}
2)与此形成对比的是,视图中的任何问题都会立即引发异常并且显而易见的是调试
first_child_url = request.current_page.get_children[0].get_absolute_url
3)当我遇到这种情况时,我有时会做的是将快捷方法添加到模型中,这允许我从模板中调用方法,但仍然保持复杂性在等式的python端。
所有这一切,如果你不能添加额外的上下文并且需要使用模板标签(如你的评论中提到的那样),我认为如果你选择复杂的模板选项是最好的。 我只使用自定义模板标签,这是做某事的唯一方法,从不作为捷径。
希望这会有所帮助......