2016-12-01 1 views
1

Je voudrais avoir une variable commune disponible pour tous mes templates. Je travaille sur ce toute la matinée et la seule façon que je peux trouver de le faire est d'avoir middleware comme ceci:Avoir une variable globale disponible pour vos templates dans Django

class GetNameMiddleware(object): 

    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     response = self.get_response(request) 
     return response 

    def process_template_response(self, request, response): 
     response.context_data['name'] = 'dave' 
     return response 

et ont une vue comme celui-ci:

from django.template.response import TemplateResponse 
from django.shortcuts import render 

def home(request): 
    return TemplateResponse(request, 'home.html', {}) 

et je peut y accéder dans le modèle

Hello {{ name }} 

il semble un peu moche que je ne peux pas utiliser render plus (je sais que je peux faire from django.template.response import TemplateResponse as render mais ce n'est pas vraiment un solution)

(Django 1.10, python 3.5.2)

+0

Pourriez-vous ajouter quelque chose au sujet de _why_ vous avez besoin de ça? Parce que je pense que c'est habituellement résolu différemment. – RemcoGerlich

+0

Oui, bien sûr. Je souhaite afficher un message sur le site pour les personnes se trouvant en dehors du Royaume-Uni. Le message a besoin de données communes comme '{% if country_code! = 'UK'%} ... {% endif%}' – Sevenearths

+1

Je suis d'accord avec [giorgosp] (http://stackoverflow.com/users/2924320/giorgosp) sur le [fournisseur de contexte personnalisé] (https://docs.djangoproject.com/fr/1.10/ref/templates/api/#writing-your-own-context-processors). Voici un [article de blog utile] (http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/). Alors que ce post est daté, le contrat, si vous voulez, pour la fonctionnalité du fournisseur de contexte reste le même. –

Répondre

7

Django a une façon standard pour mettre en œuvre ce qui est des processeurs de contexte. Cet article fournit un exemple d'implémentation https://www.webforefront.com/django/setupdjangocontextprocessors.html.

En fait, un processeur de contexte est simplement une fonction qui accepte un objet de requête et renvoie un dict avec les données que vous voulez.

+0

processeur de contexte est exactement ce que je cherchais. Travail terminé! – Sevenearths