在django中处理多种语言的多个URL的一个视图

在django中处理多种语言的多个URL的一个视图,django,django-views,Django,Django Views,我希望对不同支持的语言使用相同的视图。 例如,我有默认语言和英语 在我的主要URL中: url(r'^posts/', include('posts.urls')), #for default language url(r'^en/posts/', include('posts.urls')), #for english my posts应用程序的URL文件如下所示: url(r'^newpost/$', views.PostFormView.as_view(), name='add

我希望对不同支持的语言使用相同的视图。 例如,我有默认语言和英语

在我的主要URL中:

url(r'^posts/', include('posts.urls')),     #for default language
url(r'^en/posts/', include('posts.urls')),  #for english
my posts应用程序的URL文件如下所示:

url(r'^newpost/$', views.PostFormView.as_view(), name='add'),
url(r'^favorite/$', views.favorite, name='favorite'),
因此,例如,www.mysite.com/posts/add和www.mysite.com/en/posts/add都发送到同一个视图PostFormView,并根据url(如果它包含/en/或不包含/en/的话)以正确的语言发送内容

但是,问题在于重定向或反转始终发送到默认语言。例如,“posts:add”总是发送到www.mysite.com/posts/add,因为我有urlr“^posts/”,在urlr“^en/posts/”之前包括“posts.url”,包括“posts.url”


有没有办法对两个不同的URL使用相同的视图。或者,我如何处理多语言网站?我们是否必须为所有支持的语言复制所有应用程序?

这是一个很长的主题,不容易涵盖所有内容,但我会尽可能多地涵盖:

1-使用django国际化和本地化:

Django为多语言网站提供了内置功能:

2-对不同的GET请求使用单个URL:

您可以在URL中添加GET请求,如:site.com/posts?lang=en。在您的视图中尝试以下内容:

language = request.GET.get('lang')
然后传递此语言的正确模板

例如:

LANG_LIST = ['en', 'fa', 'fr']
if language.lower() in LANG_LIST:
     template = '{}/posts/post.html'.format(language.lower())
else:
     template = 'en/posts/post.html'
或者,您可以将一个模板与不同的语言文本一起使用,只需将语言传递给模板,然后在那里进行决定

注意:您应该将用户语言添加到他们的会话中,这样即使没有GET请求也可以检索该语言

以下是会话的文档:

您还可以将语言添加到用户配置文件中,并从中检索语言。我建议同时使用配置文件语言和用户会话

3-不同的URL可供选择:

我并不喜欢这种处理多语言网站的方式,但如果你真的需要这样做,那么你可以这样做:

你的url需要不同的名称,如lile posts\u en、posts\u fr等,这样你就可以重定向到正确的页面url。 您应该在视图中获取页面url,并检查您使用的语言。您可以这样做:request.path.split'/'。 然后,您应该检查语言并决定渲染哪个模板,就像选项2一样
这种处理多种语言的方法可能会有很多问题,因此我认为您不应该使用这种方法而不是其他两种方法。

您没有研究Django的功能,而是为不同的语言使用不同的URL吗?@ubadub+1,Django最初支持i18nURL部分的这个.Doc,我想我会熟练使用第二种方法。但是,我还有一个问题,在这种情况下,如何重定向或反转到视图,并将“?lang=en”添加到url?例如:重定向帖子:添加以获取www.mysite.com/posts/newpost/?lang=en@A2maridz好吧,那真是帮了大忙。你只需要检查会话,看看是否有语言,如果有,那么你就有你想要的语言,如果没有,就使用默认语言。基本上,每次用户更改默认语言时,只需将所选语言添加到会话中,这样在将来的请求中就不需要“lang”GET请求。