多个网址的一种视图,用于处理django

时间:2017-12-26 07:42:00

标签: django django-views

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

在我的主要网址中:

url(r'^posts/', include('posts.urls')),     #for default language
url(r'^en/posts/', include('posts.urls')),  #for english

我的帖子应用的网址文件是这样的:

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 /”或不是我用正确的语言发送内容。

然而,问题在于重定向或反向始终发送到默认语言。例如'posts:add'总是发送到“www.mysite.com/posts/add”,因为我url(r'^posts/', include('posts.urls'))之前有url(r'^en/posts/', include('posts.urls'))

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

1 个答案:

答案 0 :(得分:1)

这是一个很长的主题,并不容易涵盖所有内容,但我会尽力覆盖:

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

Django具有多语言网站的内置功能:

Internationalization and localization

2 - 使用具有不同GET请求的单个网址:

您可以在网址中添加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请求也可以检索语言。

以下是会话文档:

How to use sessions | Django documentation | Django

您还可以为用户个人资料添加语言并从中检索语言。我建议同时使用配置文件语言和用户会话。

3 - 不同的网址(您的方式):

我不是真的喜欢这种处理多语言网站的方式的粉丝,但如果你真的需要这样做,那么你就去吧:

  • 您的网址posts_enposts_fr等需要不同的名称,以便您可以重定向到正确的网址网址。
  • 您应该在视图中获取页面网址并检查您使用的语言。您可以执行以下操作:request.path.split('/')
  • 然后你应该检查语言并决定要呈现的模板,就像选项#2
  • 一样

这种处理多种语言的方式可能存在很多问题,所以我认为你不应该选择其中两种语言。