Django,如何使用render_to_response多个模板

3 投票
1 回答
584 浏览
提问于 2025-04-18 12:23

你好,我是Django的新手,今天刚开始学习它,但我在模板继承方面遇到了问题。

我在视图中有这样的一个函数:

def show(request, id=1):

return render_to_response('template1.html', {
    'name': name,
    'model1': Model1.objects.get(id=id),
    'model2': Model2.objects.get(id=id).model1,
})

我有三个不同的模板,main.html的代码是这样的:

<body>
{% block block1 %}
{% endblock %}
{% block block2 %}
{% endblock %}
</body>
</html>

还有两个模板,它们的代码类似:

{% extends 'main.html' %}
{% block block1 %}
    <h2>{{ var }}</h2>
    <pre>{{ var }}</pre>
{% endblock %}

第二个模板和第一个很像,所以我就不展示了。我的问题是:我不知道在render_to_response函数中该用哪个模板。

如果我用main.html:

 return render_to_response('main.html', {

它不会加载任何模板,但main.html的内容显示得很好,我在页面上只看到空白。

如果我用template1:

return render_to_response('template1.html', {

它只加载了main的内容和template1.html的内容,但我需要template2.html的内容。

如果我把template2.html放到这个函数里,它只显示main.html和template2.html的内容,但template1.html的内容却没有显示。

请帮我解决这个问题。

1 个回答

6

选项 1) 可以试试使用 {% include %} 标签。


main.html

<head> ... </head>
<body>
{% block content %}
{% endblock content %}

template1.html

{% extends "main.html" %}
{% block content %}
     <h1>Hello world</h1>
     {% include "nested_template2.html" %}
{% endblock content %}

nested_template2.html

<p>The world is smaller than you think.</p>

在你的视图/控制器中:

return render_to_response('template1.html', {

选项 2) 可以根据需要多次使用 {% extends ... %} 标签。我经常使用这样的结构:

templates/
----base.html
----projects/
    ----_.html
    ----detail.html
    ----list.html

base.html 是主布局。folder/_.html 是特定于某个“阶段”的内容(更模块化的内容)。


base.html

<head> ... </head>
<body>
{% block stage_content %}
{% endblock stage_content %}

projects/_.html

{% extends "main.html" %}
{% block stage_content %}
     <h1>Project Stage</h1>
     {% block page_content %}
     {% endblock page_content %}
{% endblock stage_content %}

projects/list.html

{% extends "projects/_.html" %}

{% block page_content %}
   {% for project in projects %}
       <li>{{ project.name }}</li>
   {% endfor %}
{% endblock page_content %}

projects/detail.html

{% extends "projects/_.html" %}

{% block page_content %}
   Viewing project {{ project.name }}
{% endblock page_content %}

在你的视图/控制器中:

return render_to_response('projects/detail.html', {

撰写回答