复写模板

    若应用和工程的模板模板都包含被重写的模板,默认的 Django 模板加载器会先尝试加载工程目录下的模板。换句话说,先查找 ,其次 APP_DIRS

    参见

    阅读 重写内置视图模板 若你正在找相关资料。

    首先,我们探索用在工程模板目录创建替代模板的方法。

    假设你正在重写第三方应用 blog 的模板,该应用提供了 blog/post.htmlblog/list.html 模板。工程关键配置如下:

    这些配置假定在工程根目录下有个 templates 目录。要重写 blog 应用的模板,在 目录中创建一个文件夹,然后将以下模板文件添加至该目录:

    模板加载器会先查找 DIRS 目录下的模板。当 blog 应用中的视图要求 blog/post.htmlblog/list.html 模板,加载器会返回你刚创建的文件。

    由于重写的模板位于工程应用之外,更常见的做法是使用第一个方法,然后将重写的模板置于工程模板目录。然而,如果你偏爱将重写的模板放入应用模板目录,也是可以的。

    首先,确保模板配置会搜索应用模板目录:

    若你想重写名为 blog/list.htmlblog/post.html 的模板,并将它们置于名为 myapp 的应用中,那么目录结构应该看起来像这样:

    当你配置好你的模板加载器后,你可以使用 {% extends %} 模板标签的同时来覆盖它。这样可以让你不用重写整个模板就可以做一些微小的改动。

    举个例子,你可以使用这项技术在 管理员模板中添加自定义的Logo:

    关键注意点:

    • 新的管理员模板拓展了 admin/base_site.html 并覆盖了它。
    • 被继承的管理员模板 admin/base_site.html 的其他内容没有变化。

    这个技术起作用是因为当解析到 extends 标签时模板加载器不认为这是已经加载过的有覆盖的模板(管理员模板位于 templates/admin/base_site.html)。与 block.super 的结合是对原有内容做很小的改动的有力技术。