两种语言,一种视图,不同的URL路径

时间:2019-08-30 17:40:01

标签: django django-templates

我有一个使用两种语言的django项目。我想要实现的是让不同的URL路径取决于当前语言。 不是很好,但是可行的解决方案是:

urls.py

urlpatterns = [
    ...
    url("strefa-klienta/", views.client_zone, name="strefa_klienta"),
    url("client-zone/", views.client_zone, name="client-zone"),
    ...
]

vievs.py

def client_zone(request):
    return render(request, "client_zone.html")

template.html

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}

{% if LANGUAGE_CODE == 'pl-PL' %}
    <a href="{% url 'strefa_klienta' %}">{% trans 'Client zone' %}</a>
{% else %}
    <a href="{% url 'client_zone' %}">{% trans 'Client zone' %}</a>
{% endif %}

结果没问题,我收到了网址:

  • domain.com/strefa-kleinta/-波兰语
  • domain.com/client-zone/-其余语言

呈现相同的视图,但是...不灵活。也许您可以帮忙并提出更优雅的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以为此使用Django's path converters。为此,您应该使用自定义的正则表达式路径转换器。它会匹配单个URL的任何匹配字符串,并且您可以在视图中使用kwargs访问使用了什么字符串。

将urls.py更改为正则表达式路径,以将模式与字符串匹配:

from django.urls import re_path # Use re_path for Django > 2 else path

urlpatterns = [
re_path(r'^(?P<lang_code>strefa-klienta|client-zone)/$', views.client_zone, name="client_zone_view"),
]

要获取您的views.py使用的语言,请选中kwargs

def client_zone(request, *args, **kwargs):
    lang_code = kwargs.get('lang_code')
    # You can send the lang_code in context in case you need it in template
    return render(request, "client_zone.html", context={'lang_code':lang_code})