Django:覆盖并扩展应用程序模板

Ber*_*ant 43 django django-templates

如果要覆盖django中的应用程序附带的模板(在app/templates/app /中),则在另一个目录中创建一个同名模板,模板加载器在应用程序的模板目录之前检查该模板.如果您只想覆盖模板的某些块,您还必须复制整个模板广告更改该块,这实际上不是很干.

有没有人知道覆盖orginial模板的方法,同时在扩展它时,你只需要覆盖你想要改变的特定块?(事情是这样做而不更改模板的名称,因为在某些情况下,您可能必须更改视图以使其与另一个模板一起使用)

编辑:正如亚当泰勒在Django 1.9的评论中所指出的,这可能没有任何黑客攻击.

lee*_*ech 35

我认为这个相关问题的答案是恰当的; 目前,最好的解决方案似乎是使用PyPI上django-apptemplates包中的自定义模板加载器,因此您只需使用pip来安装它(例如pip install django-apptemplates).

模板加载器允许您在特定应用程序中扩展模板; 例如,要扩展管理界面的索引页面,您需要添加

'apptemplates.Loader',
Run Code Online (Sandbox Code Playgroud)

到你的TEMPLATE_LOADERS列表settings.py,并使用

{% extends "admin:admin/index.html" %}
Run Code Online (Sandbox Code Playgroud)

在你的模板中.

  • 我认为这是一个常见的问题,但人们通过复制完整的模板来实现.如果有人尝试过,覆盖和扩展通常以无限递归结束.此票证中描述了该问题:https://code.djangoproject.com/ticket/15053 (2认同)

pap*_*rin 7

作为更新,因为这似乎是一个受欢迎的问题.我没有任何问题地使用了过度使用的应用程序.它提供了一个新的关键字过度扩展,允许扩展具有相同名称的模板.

并且使用pip很容易安装:

 pip install -U django-overextends
Run Code Online (Sandbox Code Playgroud)


Fli*_*imm 6

Django 1.9和更高版本具有此功能

Django模板加载器现在可以递归扩展模板。

因此,您可以从中获取app1具有如下内容的文件:

app1/templates/example/foobar.html

<p>I'm from app1</p>
{% block main %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下文件扩展它app2(注意模板名称example/foobar.html是相同的):

app2/templates/example/foobar.html

{% extends "example/foobar.html" %}
{% block main %}
  <p>I'm from app2</p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

最终结果应为:

<p>I'm from app1</p>
<p>I'm from app2</p>
Run Code Online (Sandbox Code Playgroud)