2009-06-21 8 views
1

Donc, je commence juste à apprendre Django, et j'essaye de compléter l'un des exemples d'applications du livre. Je suis coincé maintenant sur la création d'URL DRY. Plus spécifiquement, je n'arrive pas à faire fonctionner mon processeur de contexte. Je crée mon processeur de contexte comme si:Problème avec le processeur de contexte de Django

from django.conf import settings 
#from mysite.settings import ROOT_URL 

def root_url_processor(request): 
    return {'ROOT_URL': settings.ROOT_URL} 

et je placé ce fichier dans mon application, en particulier, monsite/PHOTOGALLERY/context_processors.py. Mon fichier settings.py à la racine de mon projet contient:

TEMPLATE_CONTEXT_PROCESSORS = ('mysite.context_processors',) 

Lorsque je tente d'aller au ROOT_URL que j'ai également précisé dans mon settings.py, je reçois cette erreur:

TypeError à/galerie/

objet 'module' est pas appelable

/galerie/est le ROOT_URL de cette application particulière. Je me rends compte que perhpas cela pourrait signifier un conflit de nommage, mais je ne peux pas en trouver un. De plus, lorsque je commente la définition TEMPLATE_CONTEXT_PROCESSORS de settings.py, l'application est effectivement chargée, mais mes images n'apparaissent pas (probablement parce que mes templates ne connaissent pas ROOT_URL, non?). Quelqu'un a-t-il des idées sur ce que pourrait être le problème?

EDIT: Voici quelques informations sur mon settings.py dans le cas où il est d'usage:

ROOT_URLCONF = 'mysite.urls' 

ROOT_URL = '/gallery/' 
LOGIN_URL = ROOT_URL + 'login/' 
MEDIA_URL = ROOT_URL + 'media/' 
ADMIN_MEDIA_PREFIX = MEDIA_URL + 'admin/' 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

TEMPLATE_CONTEXT_PROCESSORS = ('mysite.photogallery.context_processors',) 

EDIT2: Je vais ajouter quelques informations sur mes fichiers URL. Essentiellement, j'ai une racine urls.py, un real_urls.py qui est également situé à la racine, et un urls.py qui existe dans l'application. Fondamentalement, root/urls.py cache ROOT_URL de real_urls.py, qui inclut ensuite urls.py de mon application.

racine/urls.py:

from django.conf.urls.defaults import * 
#from mysite.settings import ROOT_URL 
from django.conf import settings 

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    # Example: 
    (r'^blog/', include('mysite.blog.urls')), 
         url(r'^%s' % settings.ROOT_URL[1:], include('mysite.real_urls')), 
    ) 

racine/real_urls.py:

from django.conf.urls.defaults import * 
from django.contrib import admin 

urlpatterns = patterns('', url(r'^admin/(.*)', admin.site.root), 
         url(r'^', include('mysite.photogallery.urls')), 
         ) 

racine/PHOTOGALLERY/urls.py (notez que celui-ci est sans doute pas à l'origine l'un des problèmes , mais je l'ajouter ici au cas où quelqu'un veut le voir).

from django.conf.urls.defaults import * 
from mysite.photogallery.models import Item, Photo 

urlpatterns = patterns('django.views.generic', url(r'^$', 'simple.direct_to_template', kwargs={'template': 'index.html', 'extra_context': {'item_list': lambda: Item.objects.all()} 
                           }, 
                name='index'), url(r'^items/$', 'list_detail.object_list', kwargs={'queryset': Item.objects.all(), 'template_name': 'items_list.html', 'allow_empty': True }, 
                     name='item_list'), url(r'^items/(?P<object_id>\d+)/$', 'list_detail.object_detail', kwargs={'queryset': Item.objects.all(), 'template_name': 'items_detail.html' }, name='item_detail'), url(r'^photos/(?P<object_id>\d+)/$', 'list_detail.object_detail', kwargs={'queryset': Photo.objects.all(), 'template_name': 'photos_detail.html' }, name='photo_detail'),) 
+0

Si vous l'appelez vraiment de cette façon, vous devriez également changer vos breaces réguliers dans l'instruction 'return' en bouclés pour éviter les erreurs d'analyse. – che

+0

Woops, c'était une erreur de traduction en SO. J'ai corrigé le code pour correspondre à ce que j'ai réellement. – AlbertoPL

Répondre

4

TEMPLATE_CONTEXT_PROCESSORS doit contenir une liste de ca objets llable, pas de modules. Liste les fonctions réelles qui vont transformer les contextes de modèle. Link to docs.

+0

Merci beaucoup! Le livre était plutôt confus à ce sujet; J'ai ajouté root_url_processor à la fin de mon TEMPLATE_CONTEXT_PROCESSORS et cela a fonctionné. – AlbertoPL

+2

Ne comptez pas trop sur les livres. Idéal pour apprendre, mais si vous êtes bloqué, consultez la documentation en ligne. Si vous êtes toujours coincé, vous pourriez même trouver la réponse dans le code source. évidemment SO est toujours une excellente option. – SingleNegationElimination

+1

@TokenMacGuy: Lire la source - excellent conseil. –

Questions connexes