J'aimerais savoir comment passer une variable à tous mes modèles sans répéter le même code pour toutes les méthodes de mon fichier views.py?
Dans l'exemple ci-dessous, j'aimerais que des catégories (un tableau d'objets de catégorie) soient disponibles pour tous les modèles de l'application Web.
Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?
Méthode One View
def front_page(request):
categories = Category.objects.all()
if is_logged_in(request) is False:
return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request))
else:
return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
Une autre méthode de vue
def another_view_method(request):
categories = Category.objects.all()
return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
Ce que vous voulez, c'est un processeur de contexte, et il est très facile d'en créer un. En supposant que vous ayez une application nommée custom_app
, suivez les étapes suivantes:
custom_app
à INSTALLED_APPS
dans settings.py
(c'est déjà fait, n'est-ce pas?);context_processors.py
dans custom_app
;Ajoutez le code suivant à ce nouveau fichier:
def categories_processor(request):
categories = Category.objects.all()
return {'categories': categories}
Ajoutez context_processors.py
à TEMPLATE_CONTEXT_PROCESSORS
dans settings.py
TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
Et maintenant, vous pouvez utiliser {{categories}}
dans tous les modèles: D
A partir de Django 1.8
Pour ajouter un TEMPLATE_CONTEXT_PROCESSORS
, vous devez ajouter le code suivant dans les paramètres:
TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")
Ou bien incluez cette chaîne directement dans la clé OPTIONS.context_processors
dans votre paramètre TEMPLATES
.
Comme vu dans this example, après Django 1.3, vous pouvez simplement utiliser render
au lieu de render_to_response
qui ne nécessite pas de passer explicitement le processeur de contexte.
def another_view_method(request):
categories = Category.objects.all()
return render(
'eg/front_page.html',
{'is_logged_in': is_logged_in(request), 'categories':categories}
)