更改语言后如何重定向到上一页?

时间:2019-09-17 12:36:22

标签: django

当我尝试使用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)

2 个答案:

答案 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','')