Django et les vues génériques - utilisation de extra_context
Par NiCoS le vendredi 1 décembre 2006, 22:46 - Python - Django - Lien permanent
Django met à disposition les vues génériques pour faciliter la vie du programmeur pour les questions courantes (lister un ensemble d'objets, montrer le détail d'un objet, que ce soit sous la forme d'une simple liste, ou bien par des tris de date).
Cette fonctionnalité est très pratique et permet de créer rapidement des pages. Dans ces vues génériques, on a parfois besoin d'afficher d'autres éléments et il faut bien caser les opérations nécessaires quelque part. C'est là qu'interviennent les "extra_context".
Reprenons une vue générique simple : si j'arrive sur http://www.domaine.tld/ je veux lister tous les billets d'un blog.
Je vais avoir dans urls.py :
from django.conf.urls.defaults import *
from blog.models import Post, Tag, Category
urlpatterns = patterns('django.views.generic.list_detail',
(r'^$', 'object_list', dict(queryset= Post.objects.all(),)),
)
et dans mon template :
{% block centralcontent %}
<h3>Derniers billets...</h3>
{% for object in object_list %}
<div class="post">
<h4>
<a href="{{ object.get_absolute_url }}" title="{{ object.title }}">{{ object.title }}</a>
</h4>
<p class="post-info">Rédigé le {{ object.pub_date|date:"d F Y à H:i" }}, dans
{% for post_category in object.category.all %}
<a href="{{ post_category.get_blog_absolute_url }}" title="{{ post_category.name }}">{{ post_category.name }}</a>
{% endfor %}
</p>
<div class="post-tag">Tags :
{% for post_tag in object.tag.all %}
<a href="{{ post_tag.get_blog_absolute_url }}" title="{{ post_tag.name }}">{{ post_tag.name }}</a>
{% endfor %}
</div>
<div class="post-content">{{ object.summary }}</div>
</div>
{% endfor %}
{% endblock %}
Imaginons un instant que je veuille ajouter sur ma page d'accueil la liste des tags et des catégories de mon blog. Je vais donc ajouter des éléments dans mon motif d'urls :
from django.conf.urls.defaults import *
from blog.models import Post, Tag, Category
urlpatterns = patterns('django.views.generic.list_detail',
(r'^$', 'object_list', dict(queryset= Post.objects.all(),extra_context={'all_tags': Tag.objects.all(), 'all_categories': Category.objects.all(), })),
)
et dans mon template, j'aurais juste à ajouter :
{% block rightcolumn %}
{% if all_tags %}
<h3>Tags</h3>
<ul>
{% for tag in all_tags %}
<li><a href="">{{ tag.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% if all_categories %}
<h3>Categories</h3>
<ul>
{% for categories in all_categories %}
<li><a href="" title="{{ categories.description }}">{{ categories.name }}</a></li>
{% endfor %}
</dl>
{% endif %}
{% endblock %}
Et voilà, ma page d'accueil liste mes billets, et dans la colonne de droite la liste des tags et des catégories (s'il y en a).