Django模板包含

3
我目前在使用django模板时遇到了问题。基本上我有3个模板文件:
  • Base
  • story_list
  • story_detail
story_list和story_detail都继承自Base,这很好地实现了。但是,list和detail共享一些代码,以便扩展我的侧边栏基础模板。我在两个模板中重复了一大块代码,而作为程序员的我知道这是不对的。肯定有更好的方法。我尝试了include,但是我在被包含的文件中写了:
{% block item %}
    content stuff
{% endblock %}

大约需要处理三个块。问题是没有任何东西被捕捉/渲染。如果我在扩展基本部分的块部分中包含该文件,则可以正确地转储所有内容,但是如果我不包含它在块中,则什么都没有。SSI是正确的方法吗?我尝试了一下,但似乎也无法正常工作。需要任何帮助。


我有点困惑。为什么不把侧边栏的东西放在基础中呢? - Paolo Bergantino
4个回答

16

通常情况下,在Django模板中使用include并不是最佳方案,让我从几个方面回答你的问题。

首先,让我来处理一下侧边栏。

  • 几乎所有的常见页面都会使用这个侧边栏吗? 将它放在Base中。不要覆盖那些侧边栏块(即不要在Story_*模板中编写它们)。

  • 这个侧边栏是否只在Story_*模板中出现? 创建另一个模板,比如Story_base,并进行扩展。这类似于Java中创建抽象超类。(答案在我的脑海中,但措辞无情地抄袭了jpwatts的话)。

接下来,让我来谈一下模板继承。假设你有一个名为Story_list的模板,它扩展了Base。此时,仅仅将{% extends "Base" %}放在模板中,Story_list就是Base。因为模板已经完成,所以你在Story_list中添加的任何内容都会被忽略。现在唯一能做的就是覆盖Base中定义的块。

最后,让我谈一下include。尽量避免使用它们。其他模板引擎(如PHP)似乎鼓励使用include。然而,这样做可能会导致长期来看模板难以管理。很难一眼看出一个包含的片段在模板层次结构中的位置。如果您在多个级别(在Base中一次,在Story_base中两次,在一些Story_*中一次等)包含它们,则将它们重构为模板层次结构会更加困难。


侧边栏对于所有页面都是通用的。我目前将它们放在基础模板中,并在每个模板中进行扩展。但是每个子模板中的扩展代码完全相同。这就是我想要避免的。当我必须渲染到这些特定的模板时,我能做到吗?基本上,侧边栏需要特定的变量才能完整。这就是我不理解的部分。感谢您的解释和时间。 - f4nt
2
当您呈现子模板Story_*时,请想象您正在复制Base,替换所有块中的内容为Story_*中定义的块,然后填充变量的值。如果您的Base具有侧边栏和一个{{ my_page_name }}变量,并使用my_page_name =“STORY_LIST”呈现Story_list,则会在侧边栏中看到“STORY_LIST”。 - Wesley
只有那些不问问题的人才是真正的白痴:P 不用谢。(嗯,我最好很快在SO上发布一个问题...) - Wesley

6
如果故事模板之间有共同的代码,但这些代码在整个站点中并不需要,我会创建一个名为story_base的基础模板(继承原始的base),然后将我的故事模板继承它。

0
{% include xxx.html %}

这个标签是有效的。

另一种方法是使用过滤器。过滤器调用一个函数进行渲染,可以在渲染时使用模板。


0

是的,正如上面所指出的那样,它并没有按照我设想的方式工作。 - f4nt
1
如果我在扩展基础的块部分中包含该文件,那么它会正确地转储所有内容。听起来它可以工作。我错过了什么? - S.Lott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接