2009-06-21 4 views
1

Also ich fange gerade an, Django zu lernen, und ich versuche, eine der Beispielanwendungen aus dem Buch zu vervollständigen. Ich bleibe jetzt beim Erstellen von DRY-URLs stecken. Genauer gesagt kann ich meinen Kontextprozessor nicht zum Laufen bringen. Ich eröffne mein Kontext Prozessor als so:Django Context Processor Trouble

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

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

und legte ich diese Datei in meiner app, insbesondere mysite/Fotogalerie/context_processors.py. Meine settings.py Datei im Stamm meines Projektes enthält:

TEMPLATE_CONTEXT_PROCESSORS = ('mysite.context_processors',) 

Als ich zum ROOT_URL zu gehen versuchen, dass ich auch in meinem settings.py angegeben habe, erhalte ich diese Fehlermeldung:

Typeerror bei/gallery/

'Modul' Objekt ist nicht aufrufbar

/gallery/ist die ROOT_URL dieser speziellen Anwendung. Mir ist klar, dass dies ein Namenskonflikt bedeuten könnte, aber ich kann keinen finden. Wenn ich die TEMPLATE_CONTEXT_PROCESSORS-Definition aus settings.py auskommentiere, wird die Anwendung tatsächlich geladen, aber meine Miniaturbilder erscheinen nicht (wahrscheinlich, weil meine Vorlagen nichts über ROOT_URL wissen, richtig?). Hat jemand irgendwelche Ideen, was das Problem sein könnte?

EDIT: Hier einige Informationen über meine settings.py, falls es von Nutzen ist:

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: Ich werde einige Informationen über meine URL-Dateien hinzufügen. Im Wesentlichen habe ich ein root urls.py, ein real_urls.py, das sich auch im root befindet, und ein urls.py, das in der Anwendung existiert. Grundsätzlich versteckt root/urls.py ROOT_URL vor real_urls.py, das dann die URLs.py meiner App enthält.

root/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')), 
    ) 

root/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')), 
         ) 

root/Fotogalerie/urls.py (beachten Sie, dass dieses wahrscheinlich keine der Probleme verursacht , aber ich hinzufüge es hier falls jemand es sehen will.):

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

Wenn Sie es wirklich so nennen, sollten Sie auch Ihre regulären Brüche in 'return' Anweisung in lockere ändern, um Parsing Fehler zu vermeiden. – che

+0

Woops, das war ein Fehler bei der Übersetzung in SO. Ich habe den Code so angepasst, dass er dem entspricht, was ich tatsächlich habe. – AlbertoPL

Antwort

4

TEMPLATE_CONTEXT_PROCESSORS eine Liste von ca enthalten sollte lable Objekte, keine Module. Listen Sie die tatsächlichen Funktionen auf, die die Vorlagenkontexte transformieren. Link to docs.

+0

Vielen Dank! Das Buch war ziemlich verwirrend; Ich habe root_url_processor an das Ende meiner TEMPLATE_CONTEXT_PROCESSORS angehängt und es hat funktioniert. – AlbertoPL

+2

Verlassen Sie sich nicht zu sehr auf Bücher. Großartig zum Lernen, aber wenn Sie nicht weiterkommen, lesen Sie die Online-Dokumentation. Wenn Sie immer noch feststecken, finden Sie möglicherweise die Antwort im Quellcode. offensichtlich ist SO immer noch eine gute Option. – SingleNegationElimination

+1

@TokenMacGuy: Lesen Sie die Quelle - ausgezeichneter Rat. –