Alb Dum
Alb Dum

Reputation: 1131

Django - "Include" a block in several templates? Template tag? Something else?

I have a little statistics block that I want to be available in several places: the profile page of a user, and a search page with a list of users.

What would be the best way to proceed in repeating this block? I come from a PHP background, and in PHP it would be a simple include with passing some simple arguments. In django, I basically want to be able to call something like :

 {% stats_block user %}

Where user is the object containing all the user info. I was thinking about a simple template tag, but the block is pretty big and I don't want to put eveything in one line in the template tag.

Thanks a lot!

Upvotes: 13

Views: 19136

Answers (2)

jpic
jpic

Reputation: 33420

include template tag

You can include templates with arguments:

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

Template inheritance

But the best way to repeat a block in all templates, is to have a base template say base.html:

<html>
...
    <div id="user-block">
        {% if request.user.is_authenticated %}
            hello {{ request.user }}
        {% else %}
            <a href="{% url acct_signup %}">Sign up!</a>
        {% endif %}
    </div>
 ...
    <div id="body">
        {% block body %}
        {% endblock %}
    </div>
 ...
 </html>

For example, the contact template could be as simple as:

{% extends 'base.html' %}

{% block body %}
    Contact use: [email protected]
{% endblock %}

Refer to documentation on template inheritance for more.

inclusion_tag

Finally, another great option is to make an inclusion_tag, which allows to hook some python context processing before actual template inclusion.

Upvotes: 42

Rohan
Rohan

Reputation: 53386

You can write a custom template tag, which can render a specific template. Refer Inclusion tags.

From the link: Another common type of template tag is the type that displays some data by rendering another template.

Upvotes: 1

Related Questions