当我尝试使用next
时不起作用,因为在next
-url中有旧的语言代码,因此语言不会更改。
我的模板:
<a href="{% url "set_language_from_url" user_language="en" %}?next={{request.path}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{request.path}}">ru</a>
我的网址:
path('language-change/<user_language>/', views.set_language_from_url, name="set_language_from_url"),
我的观点:
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
return redirect(redirect_to)
答案 0 :(得分:0)
您可以使用Django内置的set_language_view。
这是一个可用于更改用户语言的视图,当传递redirect_to时,它将自动为下一个页面建立正确的URL。
您可以查看文档中提供的示例。
您还可以简单地将代码更改为不包括请求的路径,而是重定向到的URL名称,例如(假设您的url_patterns中包含一个名为“ view_page”的URL:
<a href="{% url "set_language_from_url" user_language="en" %}?next={{'view_page'}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{'view_page'}}">ru</a>
您的视图:
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
return redirect(reverse(redirect_to))
编辑:
要返回到当前请求而不是预定义请求(我尚未对此进行测试,因此我不知道它是否可以):
您可以尝试resolving当前请求的路径,然后通过传递正确的参数来再次反转它。这应该像以前一样返回确切的url,只是带有不同的语言前缀。
<a href="{% url "set_language_from_url" user_language="en" %}?next={{request.path}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{request.path}}">ru</a>
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
resolved_url = resolve(redirect_to)
if resolved_url.kwargs:
return redirect(reverse(resolved_url.url_name, **resolved_url.kwargs))
else:
return redirect(reverse(resolved_url.redirect_to, *resolved_url.args))
答案 1 :(得分:0)
使用redirect_to =请求。 META.get('HTTP_REFERER','')