user2757588
user2757588

Reputation: 71

Django, how to use render_to_response with many templates

Hello i am newbie in Django, started to learn it today and i have problem with template inheritance i have such function in my view:

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,
})

And i have 3 different templates, main.html with such code:

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

and two more tempaltes that contains code like that:

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

second one is very similar so i wont show it, problem is: i dont know which one to put in render_to_response function. if i put main.html:

 return render_to_response('main.html', {

it doesn't load any templates, but content from main.html appears well, i can just see empty space on page if i put template1:

return render_to_response('template1.html', {

It load only content from main and from template1.html but i need content from template2.html

if i put template2.html to function it only shows content from main.html and from template2.html but no content from template1.html Please help me how to solve that problem.

Upvotes: 3

Views: 608

Answers (1)

pztrick
pztrick

Reputation: 3831

Option 1) Try using the {% include %} tag.


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>

In your view/controller:

return render_to_response('template1.html', {

Option 2) Chain {% extends ... %} tags as deep as you want. I frquently use this structure:

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

The base.html is the master layout. The folder/_.html is specific to a "stage" (more modular content).


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 %}

In your view/controller:

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

Upvotes: 6

Related Questions