django模板包含

3 投票
4 回答
8614 浏览
提问于 2025-04-15 11:31

我现在在使用Django模板时遇到了一些问题。我有三个模板文件,基本上是:

  • Base(基础模板)
  • story_list(故事列表)
  • story_detail(故事详情)

story_list和story_detail都继承自Base模板,这样运行得很好。不过,列表和详情这两个模板有一些代码是共享的,它们都需要用到基础模板中的侧边栏。我发现我在两个模板中重复了一段代码,这让我觉得不太对劲。肯定有更好的方法,我相信这一点。我试过使用包含(includes),但是在我包含的文件中:

{% block item %}
    content stuff
{% endblock %}

大约有3个代码块。问题是,这些代码没有被识别或渲染出来。如果我把这个文件放在一个扩展Base的代码块里,它就能正常显示,但如果我不放在代码块里,就什么都看不到。请问SSI(服务器端包含)是解决办法吗?我试过这个,但似乎也不太管用。任何帮助都非常感谢。

4 个回答

0

你可以使用一个叫做 {% include %} 的标签来实现这个功能。

6

如果在故事模板中有一些共同的代码,但这些代码并不需要在整个网站上使用,我会创建一个叫做 story_base 的东西(它是从原来的 base 扩展出来的),然后让我的故事模板都基于这个 story_base

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_*中一次等等),这会让重构变得更加困难。

撰写回答