61 votes

Django, processeurs de contexte de modèle

J'ai un problème étrange, je veux ajouter une requête globale en utilisant des context processors. Voici comment je l'ai fait en suivant:

J'ai créé un processor.py dans mon application comme ceci:

from myproject.myapp.models import Foo

def foos(request):
    return {'foos': Foo.objects.all()}

et à la fin de mon setting.py j'ai ajouté ceci:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)

Enfin je passe ma vue comme ceci:

def index_view(request):

    return render_to_response('index.html', {}, context_instance=RequestContext(request))

et dans mon template index.html:

{% for foo in foos %}
    {{ foo.name }}
{% endfor %}

Et enfin mon URL:

(r'^$', 'myapp.views.index_view'),

Mes foos s'affichent sans aucun problème, cependant mon media_url et d'autres contextes ont disparu. Quel peut être le problème?

178voto

Greg Glockner Points 1594

Vous devez ajouter les valeurs par défaut de TEMPLATE_CONTEXT_PROCESSORS. Cependant, au lieu de coder en dur ces valeurs, qui seront liées à une version spécifique de Django, vous pouvez ajouter votre processeur de contexte aux valeurs par défaut de la manière suivante :

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos",
)

Assurez-vous d'inclure la virgule finale dans le tuple, afin que Python le reconnaisse comme un tuple.

55voto

TM. Points 20051

Lorsque vous spécifiez ceci :

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',)

Dans votre fichier de paramètres, vous remplacez les processeurs de contexte par défaut de Django. Pour étendre la liste, vous devez inclure les processeurs par défaut dans vos paramètres :

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "myapp.processor.foos",
)

Remarquez que les paramètres ci-dessus sont les valeurs par défaut (plus votre processeur) pour django 1.1.

6voto

David Dehghan Points 1047

Voici ce qui a fonctionné pour moi pour Django 1.3

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.core.context_processors.static",
    "django.contrib.messages.context_processors.messages",
    "myapp.processor.foos", )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X