Django 1.5.5:重定向忽略区域设置

时间:2014-01-22 10:19:13

标签: python django redirect locale django-1.5

我是Django的新手并在这里开展一个项目,那里有一个小问题我似乎无法找到解决方法:

我可以使用localhost:8000/访问我的项目。此网址重定向到localhost:8000/en/dimension//en/是我浏览器的默认语言环境,所以一切都很好。

但问题是,localhost:8000/fr/仍会重定向到/en/dimension/,同样适用于/nl/

这是我的urls.py文件:

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns
from django.shortcuts import redirect
from django.contrib import admin


from opendataApp.views import dimensionStep, productStep, zoneStep, formatStep, geographicalAreaStep, customStep, downloadStep, proxy, downloadCustom, statistics, statisticsReset, statisticsFilter

admin.autodiscover()

urlpatterns = patterns(
    '',
    url(r'^proxy/urbis/(?P<path>.*)$', proxy),
    #translation
    (r'^i18n/', include('django.conf.urls.i18n')),
    (r'^admin/', include(admin.site.urls)),

    # Uncomment the admin/doc line below to enable admin documentation:
    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    #url(r'^admin/', include(admin.site.urls)),
)

urlpatterns += i18n_patterns(
    '',

    url(r'^$', lambda r: redirect('/dimension/'), name="home"),
    url(r'^dimension', dimensionStep, name="dimensionStep"),
    url(r'^product', productStep, name="productStep"),
    url(r'^zone', zoneStep, name="zoneStep"),
    url(r'^format', formatStep, name="formatStep"),
    url(r'^selection', geographicalAreaStep, name="geographicalAreaStep"),
    url(r'^custom-selection', customStep, name="custom"),
    url(r'^download/$', downloadStep, name="download"),
    url(r'^download-custom/$', downloadCustom, name="downloadCustom"),
    url(r'^statistics/$', statistics, name="statistics"),
    url(r'^statistics/reset$', statisticsReset, name="statisticsReset"),
    url(r'^statistics/filter$', statisticsFilter, name="statisticsFilter"),
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'),

)

所以我的主要问题是redirect('/dimension/')忽略了之前询问的区域设置并再次回退到默认区域设置。知道如何解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

LocaleMiddleware负责确定浏览器应提供的语言;它一直在为您的浏览器选择en,您需要找出原因。

有关详细信息,请参阅How Django discovers language preference,但简短命令是:

  1. 查看路径前缀;对于//dimension/,还没有一个。
  2. 在会话中查找_language密钥(回退到django_language以获得向后兼容性)。
  3. 寻找django_language Cookie(或您在settings.LANGUAGE_COOKIE_NAME中设置的任何内容)
  4. 查看浏览器Accept-Language标题
  5. 使用settings.LANGUAGE_CODE
  6. 请注意, nothing 会明确设置会话密钥或Cookie;你自己的代码需要这样做。您可以使用set_language() redirect view为您执行此操作;您的网络用户界面中的表单会POST到该视图,以便让访问者设置不同的语言。

    当访问者访问/fr/并且还没有明确的Cookie或会话密钥时,您还可以明确设置会话密钥或Cookie。您可以在^$网址映射(适用于任何i18n_patterns()请求)中/<language_code>/附加的视图中执行此操作,而不是现在的重定向。当然,该视图仍然可以重定向。

    即使没有明确设置Cookie,您的重定向也应至少使用request.LANGUAGE_CODE变量:

    url(r'^$', lambda r: redirect('/{}/dimension/'.format(r.LANGUAGE_CODE)), name="home"),
    

答案 1 :(得分:1)

您是否尝试过清除浏览器缓存?浏览器通常会缓存重定向。