89 votes

Django - Comment rendre une variable disponible pour tous les modèles?

Je voudrais savoir comment passer une variable à tous mes modèles, sans répéter le même code dans chaque méthode de mon fichier views.py ?

Dans l'exemple ci-dessous, je voudrais rendre les catégories (un tableau d'objets de catégorie) disponibles à tous les modèles de l'application web.

Par exemple: Je voudrais éviter d'écrire 'categories':categories dans chaque méthode. Est-ce possible ?

Une méthode de vue

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

144voto

Ce que vous voulez est un processeur de contexte, et c'est très facile d'en créer un. En supposant que vous avez une application nommée custom_app, suivez les étapes suivantes :

  • Ajoutez custom_app à INSTALLED_APPS dans settings.py (vous l'avez déjà fait, n'est-ce pas?) ;

  • Créez un fichier context_processors.py dans le dossier 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

À partir de Django 1.8

Pour ajouter un TEMPLATE_CONTEXT_PROCESSORS, dans les paramètres vous devez ajouter le code suivant :

TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")

Ou inclure cette chaîne directement dans la clé OPTIONS.context_processors de votre paramètre TEMPLATES.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X