上下文中缺少请求

时间:2011-07-20 15:51:35

标签: django

我正在尝试在我的某个项目中使用 django-localeurl ,但是按照文档我只会收到错误。我想要的是在模板中使用此代码:

    {% load i18n %}
    {% load localeurl_tags %}
    {% get_available_languages as LANGUAGES %}
    {% get_current_language as LANGUAGE_CODE %}

    {% for lang in LANGUAGES %}
      {% ifequal lang.0 LANGUAGE_CODE %}
      <li class="selected">{{ lang.1 }}</li>
      {% else %}
      <li><a href="{{ request.path|chlocale:lang.0 }}">{{ lang.1 }}</a></li>
      {% endifequal %}
    {% endfor %}

来自:http://packages.python.org/django-localeurl/usage.html

我收到了这个错误

    Caught AssertionError while rendering: URL must start with SCRIPT_PREFIX: 

问题出在这一行:

    <li><a href="{{ request.path|chlocale:lang.0 }}">{{ lang.1 }}</a></li>

request.path是一个空字符串。但为什么?在浏览器中我可以看到127.0.0.1/hu/,所以如果我是对的它应该包含/hu/

为简单起见,我在虚拟环境中使用django 1.3和django-localeurl创建了一个全新的项目。

我的settings.py看起来像(我知道的重要部分):

LANGUAGES = (
  ('hu', 'Hungarian'),
  ('en', 'English'),
  ('sk', 'Slovakian'),
)

LANGUAGE_CODE = 'hu'

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'localeurl.middleware.LocaleURLMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
  "django.contrib.auth.context_processors.auth",
  "django.core.context_processors.debug",
  "django.core.context_processors.request",
  "django.core.context_processors.i18n",
  "django.core.context_processors.media",
  "django.core.context_processors.static",
  "django.contrib.messages.context_processors.messages",
)
INSTALLED_APPS = (
    'localeurl',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

我错过了什么?

编辑1: 我可以将request.path manually放到上下文中:

def main(request):  
  return render_to_response( 'base.html', {'rpath': request.path})

比我在模板中使用rpath而不是request.path,但是...... request.path应该包含一些内容,因为django.core.context_processors.request中的TEMPLATE_CONTEXT_PROCESSORS }}

3 个答案:

答案 0 :(得分:3)

问题与localeurl无关,以下视图有效:

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

我认为将django.core.context_processors.request放入TEMPLATE_CONTEXT_PROCESSORS来完成工作,但不是。

答案 1 :(得分:0)

区域设置URL中间件攻击request.path我认为你要找的是request.path_info

答案 2 :(得分:0)

在您的视图中,返回响应时,请指定context_instance,如下所示:

from django.shortcuts import render_to_response
from django.template.context import RequestContext

return render_to_response('base.html',{'object':object},context_instance=RequestContext(request))