web-dev-qa-db-fra.com

créer mon propre processeur de contexte dans django

Je suis arrivé à un point où je dois transmettre certaines variables à toutes mes vues (principalement des variables de type d'authentification personnalisées).

On m'a dit qu'écrire mon propre processeur de contexte était la meilleure façon de le faire, mais j'ai des problèmes.

Mon fichier de paramètres ressemble à ceci

TEMPLATE_CONTEXT_PROCESSORS = (
    "Django.contrib.auth.context_processors.auth",
    "Django.core.context_processors.debug",
    "Django.core.context_processors.i18n",
    "Django.core.context_processors.media",
    "Django.contrib.messages.context_processors.messages",
    "sandbox.context_processors.say_hello", 
)

Comme vous pouvez le voir, j'ai un module appelé "context_processors" et une fonction à l'intérieur de celui-ci appelé "say_hello".

Qui ressemble

def say_hello(request):
        return {
            'say_hello':"Hello",
        }

Ai-je raison de supposer que je peux maintenant faire ce qui suit dans mes vues?

{{ say_hello }}

En ce moment, cela ne donne rien dans mon modèle.

Ma vue ressemble à

from Django.shortcuts import render_to_response

def test(request):
        return render_to_response("test.html")
75
dotty

Le processeur de contexte que vous avez écrit devrait fonctionner. Le problème est à votre avis.

Êtes-vous certain que votre vue est rendue avec RequestContext?

Par exemple:

def test_view(request):
    return render_to_response('template.html')

La vue ci-dessus n'utilisera pas les processeurs de contexte répertoriés dans TEMPLATE_CONTEXT_PROCESSORS. Assurez-vous de fournir un RequestContext comme ceci:

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))
49
TM.

Selon les Django docs vous pouvez utiliser render comme raccourci au lieu de render_to_response avec l'argument context_instance:

Vous pouvez également utiliser le raccourci render() qui est identique à un appel à render_to_response () avec un argument context_instance qui force l'utilisation d'un RequestContext.

28
bpetit

Depuis Django 1.8 vous enregistrez vos processeurs de contexte personnalisés comme ceci:

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [
            'templates'
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'Django.template.context_processors.debug',
                'Django.template.context_processors.request',
                'Django.contrib.auth.context_processors.auth',
                'Django.contrib.messages.context_processors.messages',
                'www.context_processors.instance',
            ],
        },
    },
]

en supposant que votre processeur de contexte est dans l'application www dans context_processors.py

9
andilabs

Si vous utilisez le raccourci render_to_response() de Django pour remplir un modèle avec le contenu d'un dictionnaire, votre modèle recevra par défaut une instance de contexte (pas un RequestContext). Pour utiliser un RequestContext dans le rendu de votre modèle, utilisez le raccourci render() qui est identique à un appel à render_to_response() avec un context_instance argument qui force l'utilisation d'un RequestContext.

2
GrvTyagi