2010-05-23 6 views
58

Je suis arrivé à un point où j'ai besoin de transmettre certaines variables à toutes mes vues (principalement des variables de type d'authentification personnalisées).créer mon propre processeur de contexte dans django

On m'a dit que l'écriture de mon propre processeur de contexte était la meilleure façon de le faire, mais j'ai quelques problèmes.

Mon fichier de paramètres ressemble à ce

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 au sein de cette appelée « 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 les mon point de vue?

{{ say_hello }} 

En ce moment, ce qui rend à rien dans mon modèle.

Mon point de vue ressemble

from django.shortcuts import render_to_response 

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

Répondre

41

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

Etes-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 ne sera pas utiliser les processeurs de contexte répertoriés dans TEMPLATE_CONTEXT_PROCESSORS. Assurez-vous que vous fournissez un RequestContext comme ceci:

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

La 'context_instance' est ce qui manquait! Merci TM – dotty

+0

Suivi, pourquoi j'ai besoin de context_instance? Comment se fait-il que je n'en ai pas besoin si j'utilise le système d'authentification de django? – dotty

+0

Les vues intégrées de Django gèrent cela pour vous (elles utilisent un 'RequestContext'). Pensez au processeur de contexte que vous avez créé. Il prend 'request' comme argument. Cela signifie que vous devez en quelque sorte donner la requête en cours à la logique de rendu. 'RequestContext' gère simplement la logique simple de boucler à travers tous les processeurs de contexte et de leur passer la requête courante, puis de mettre à jour le contexte de la page avec les résultats. –

24

Selon le 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.

+0

En effet, ces jours-ci cela est possible. – fabspro

2

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

Questions connexes