【问题标题】:Django Context Processor TroubleDjango 上下文处理器故障
【发布时间】:2010-11-04 17:33:55
【问题描述】:

所以我刚刚开始学习 Django,我正在尝试完成书中的一个示例应用程序。我现在被困在创建 DRY URL 上。更具体地说,我无法让我的上下文处理器工作。我这样创建上下文处理器:

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

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

然后我将此文件放在我的应用程序中,特别是 mysite/photogallery/context_processors.py 。我的项目根目录中的 settings.py 文件包含:

TEMPLATE_CONTEXT_PROCESSORS = ('mysite.context_processors',)

当我尝试访问我在 settings.py 中指定的 ROOT_URL 时,我收到此错误:

/gallery/ 中的类型错误

'module'对象不可调用

/gallery/ 是这个特定应用程序的 ROOT_URL。我意识到这可能意味着命名冲突,但我找不到。此外,当我从 settings.py 中注释掉 TEMPLATE_CONTEXT_PROCESSORS 定义时,应用程序确实加载了,但是我的缩略图没有出现(可能是因为我的模板不知道 ROOT_URL,对吧?)。任何人都知道问题可能是什么?

编辑:以下是关于我的 settings.py 的一些信息,以备不时之需:

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:我将添加一些关于我的 url 文件的信息。本质上,我有一个根 urls.py、一个也位于根的 real_urls.py 和一个存在于应用程序中的 urls.py。基本上,root/urls.py 隐藏了 real_urls.py 中的 ROOT_URL,然后包含了我的应用程序的 urls.py。

根/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/photogallery/urls.py(请注意,这可能不会导致任何问题,但我将其添加到此处以防有人想查看它。):

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

【问题讨论】:

  • 如果你真的这么称呼它,你还应该将'return'语句中的常规括号更改为大括号,以防止解析错误。
  • 糟糕,将其转换为 SO 时出错。我已经修复了代码以匹配我实际拥有的代码。

标签: python django django-urls


【解决方案1】:

TEMPLATE_CONTEXT_PROCESSORS 应该包含可调用对象的列表,而不是模块。列出将转换模板上下文的实际函数。 Link to docs

【讨论】:

  • 非常感谢!这本书对此相当混乱。我将 root_url_processor 附加到我的 TEMPLATE_CONTEXT_PROCESSORS 的末尾并且它起作用了。
  • 不要过分依赖书籍。非常适合学习,但如果遇到困难,请查看在线文档。如果您仍然卡住,您甚至可以在源代码中找到答案。显然 SO 仍然是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多