如何将一个模板插入另一个模板?


79

我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。

我应该如何在views.py中构建代码?

我这样做的原因是稍后将使用Ajax填充。我这样做对吗?

Answers:


142

你可以做:

<div class="basic">
{% include "main/includes/subtemplate.html" %}    
</div>

subtemplate.html另一个Django模板在哪里。在这里,subtemplate.html您可以放入使用Ajax获得的HTML。

您还可以多次包含模板:

<div class="basic">
{% for item in items %}
    {% include "main/includes/subtemplate.html" %}    
{% endfor %}
</div>

抱歉,忘了提及:该子模板可能被实例化到basic_template.html中多次
WindowsMaker

1
也可以,您可以在模板的for循环中包含模板,请参见更新后的答案。
Simeon Visser 2012年

1
在项目循环中,我不应该在子模板上下文中传递项目{% include "includes/subtemplate.html" with item=item %}吗?
Capi Etheriel 2014年

8
@barraponto,您可以执行此操作,但子模板item中已提供该功能。如果希望保持子模板的上下文整洁,则可以使用{% include "includes/subtemplate.html" with item=item only %}来仅从item父模板传递到子模板。
Simeon Visser 2014年

这应该在Django文档中添加!感谢您的帮助。
varagrawal

24

您可以使用来执行此操作块是Django模板标签,它将覆盖您扩展的模板部分我在下面提供了一个示例。

basic_template.html

<body>
{% block 'body' %}
{% endblock %}
</body>

您要包括的模板:(例如example.html)

{% extends 'basic_template.html' %} 
{% block 'body' %}
/* HTML goes here */
{% endblock %}

views.py

return render_to_response(template='example.html', context, context_instance)

这样做会加载basic_template.html,但用中包含的内容替换{% block 'body' %} {% endblock %}basic_template.html中的所有内容{% block 'body' %} {% endblock %}

您可以在Django Docs中阅读有关块和模板继承的更多信息


这样执行和执行{%include“ main / includes / example.html”%}有什么区别?
Michael Lafayette

3
@MichaelLafayette,将扩展视为继承而将其作为导入。
Mox

1
使用一种方法相对于另一种方法是否具有任何性能优势?该{% include "main/includes/example.html" %}方法看起来更简单(它肯定了KISS)。
哈桑·拜格


0

我只是想添加扩展和包含的区别。模板和包含均可使用当前应用程序中插入的模型。模板可供您的任何应用程序全局使用。Include用于某些应用程序。例如:您想将Image Slider插入首页和关于页面,但无其他地方。为了方便起见,您可以使用自己的模型创建Slider应用,并导入其模型并将其包含在该页面中。如果在此示例中使用模板,则将创建2个模板,其中一个带有滑块,其他所有模板都具有。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.