django模板包含
我现在在使用Django模板时遇到了一些问题。我有三个模板文件,基本上是:
- Base(基础模板)
- story_list(故事列表)
- story_detail(故事详情)
story_list和story_detail都继承自Base模板,这样运行得很好。不过,列表和详情这两个模板有一些代码是共享的,它们都需要用到基础模板中的侧边栏。我发现我在两个模板中重复了一段代码,这让我觉得不太对劲。肯定有更好的方法,我相信这一点。我试过使用包含(includes),但是在我包含的文件中:
{% block item %}
content stuff
{% endblock %}
大约有3个代码块。问题是,这些代码没有被识别或渲染出来。如果我把这个文件放在一个扩展Base的代码块里,它就能正常显示,但如果我不放在代码块里,就什么都看不到。请问SSI(服务器端包含)是解决办法吗?我试过这个,但似乎也不太管用。任何帮助都非常感谢。
4 个回答
你可以使用一个叫做 {% include %} 的标签来实现这个功能。
如果在故事模板中有一些共同的代码,但这些代码并不需要在整个网站上使用,我会创建一个叫做 story_base
的东西(它是从原来的 base
扩展出来的),然后让我的故事模板都基于这个 story_base
。
一般来说,在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_*
中一次等等),这会让重构变得更加困难。