我有一个使用两种语言的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/
-其余语言呈现相同的视图,但是...不灵活。也许您可以帮忙并提出更优雅的解决方案?
答案 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})