web-dev-qa-db-fra.com

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

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

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:

  • Ajoutez custom_app à INSTALLED_APPS dans settings.py (c'est déjà fait, n'est-ce pas?);
  • Créez un dossier 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.

86

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}
    )
0
aydow