2013-03-06 39 views
0

只有当用户选择英文时,我才有必要在此处输入www.example.com/something/something/www.example.com/en/something/something/根据用户选择的语言进行网址重写

这是一个现有的网站已完成在Django的URL与正常的部分完成。现在,如果用户选择英文,我必须重写网址。

我以为我可以手动启动改变Django模板所有的URL像这样

{% if request.session.language == 'en' %} 
    <a href="/en/something"..> 
{% else %} 
    <a href="/something"..> 
{% endif %} 

但我一直要求不要做这种方式的链接的数量实在是太多了做这样。

后来我想尝试一个自定义的中间件,在那里我可以访问请求对象process_request,做return HttpResponsePermanentRedirect(redirect_url)

但似乎process_request处理所有的请求一个接一个,包括图像等各个环节。但我想要的是第一个请求,即请求的实际url。

所以我在中间件的构造函数中尝试了相同的操作,希望它只会被调用一次,那将是第一个请求。但我面临的问题是,__init__只接受self**args而不是request对象,所以我无法访问那里的会话变量。

我想过在apache中尝试这种方式,但只有在用户选择英文语言时,我才需要执行url重定向。

回答

2

一旦您从文档中读取internationalization in django urls patterns,您将会意识到它是一个简单的过程。

  1. 更新您的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 
    ) 
    
  2. 确保django.middleware.locale.LocaleMiddleware在你settings.pyMIDDLEWARE_CLASSES部分。

就是这样。现在您的模式将根据用户选择的语言进行更新。

+0

Burhan Khalid先生非常感谢你。我会立即尝试,并让你知道。再次感谢 – 2013-03-06 07:17:08

+0

我可以问一下,这个可以在url中做“i18n_patterns”吗?这是我第一次看到,只是想学习新东西:) – catherine 2013-03-06 07:20:58

+0

您好先生Burhan,我使用的是django 1.3,它会抛出一个导入错误,如果我从django.conf.urls.i18n导入i18n_patterns – 2013-03-06 07:26:14