2013-07-27 5 views
35

Je voudrais savoir comment passer une variable à tous mes modèles, sans répéter le même code sur chaque méthode dans mon fichier views.py?Django - Comment rendre une variable disponible pour tous les templates?

Dans l'exemple ci-dessous, je souhaite 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 Une 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)) 
+1

Ils sont appelés 'CONTEXT PROCESSORS' –

Répondre

71

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

  • Ajouter custom_app à INSTALLED_APPS dans settings.py (vous avez déjà fait, non?); Créez un 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} 
    
  • Ajouter 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

Comme de Django 1.8

Pour ajouter un TEMPLATE_CONTEXT_PROCESSORS, dans les paramètres que 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 dans votre milieu TEMPLATES.

+0

Cela fonctionne! Merci:) – ipegasus

+0

Vous êtes les bienvenus: D –

+0

Est-il possible de faire fonctionner cette application pour n'importe quelle application dans le projet, au lieu de simplement 'custom_app'? – jvannistelrooy

Questions connexes