我有一个要求,只有当用户选择英语时,我必须将此网址www.example.com/something/something/
写入www.example.com/en/something/something/
。
这是针对已在django中完成的现有站点,其中url用于正常部分完成。现在,如果用户选择英语,我必须重写网址。
我以为我可以手动开始更改django模板中的所有网址,如此
{% if request.session.language == 'en' %}
<a href="/en/something"..>
{% else %}
<a href="/something"..>
{% endif %}
但我被要求不这样做,因为链接的数量太多了,不能这样做。
然后我考虑尝试一个自定义中间件,在那里我可以访问process_request
中的请求对象并执行return HttpResponsePermanentRedirect(redirect_url)
但似乎process_request
逐个处理所有请求,包括图像和其他链接。但我想要的是第一个请求,即请求的实际网址。
所以我在中间件的构造函数中尝试了相同的操作,希望它只被调用一次,这将是第一个请求。但我遇到的问题是__init__
仅接受self
和**args
而不接受request
对象,因此我无法访问那里的会话变量。
我考虑过在apache中尝试这个,但是只有当用户选择英语时我才需要进行网址重定向。
答案 0 :(得分:2)
从文档中阅读internationalization in django urls patterns后,您将意识到这是一个简单的过程。
更新urls.py
:
from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns('',
url(r'^something/$', 'something.view', name='something'),
# other urls like you would normally have
)
确保django.middleware.locale.LocaleMiddleware
的{{1}}部分中有MIDDLEWARE_CLASSES
。
就是这样。现在,您的模式将根据用户选择的语言进行更新。