web-dev-qa-db-fra.com

Django, processeurs de contexte de modèle

J'ai un problème étrange, je veux ajouter une requête globale à l'aide de processeurs de contexte. Voici comment je l'ai fait en suivant :

fait un processor.py dans mon application en tant que tel:

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 mon avis comme suit:

def index_view(request):

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

et sur mon modèle index.html:

<select id="select_foo">
{% for foo in foos %}
    <option value="/{{ foo.slug }}">{{ foo.name }}</option>
{% endfor %}
</select>

Et enfin mon URL:

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

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

60
Hellnar

Lorsque vous spécifiez ceci:

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

Dans votre fichier de paramètres, vous remplacez les Django's processeurs de contexte par défaut . Pour étendre la liste, vous devez inclure ceux 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",
)

Remarque, les paramètres ci-dessus sont les valeurs par défaut (plus votre processeur) pour Django 1.1.

54
TM.

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 comme suit:

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

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

177
Greg Glockner

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", )
6
David Dehghan