Django - 在 GET 之后将用户重定向到特定视图到一个单独的视图,更改语言设置

Django - redirecting a user to a specific view after GET to a separate view, changing language settings

我有一个网站提供 2 种语言选择 - 英语和日语。

要在语言之间切换,用户单击按钮将他们带到更改设置的视图。以前,它总是重定向到主页,但现在我想把它们带到它们之前所在的位置。

当前路径作为 url 参数传递,然后保存到响应变量,然后在返回之前设置其语言 cookie。

出于某种原因,当我在 redirect 函数中使用参数时,语言 cookie 根本没有设置,而是使用 reverse (即当它被硬编码为返回主页时) 工作正常。

如何让带参数的 redirect 函数像带 reverse 的函数一样工作?

提前致谢!

代码:

模板链接:

<a href="{% url 'language' 'en' %}?q={{ request.path }}" class="lang-choice btn btn-primary">English</a>
<a href="{% url 'language' 'ja' %}?q={{ request.path }}" class="lang-choice btn btn-info">日本語</a>

网址:

path('lang/<str:language>/', v.change_language, name='language')

查看:

def change_language(request, language): # language is 'en' or 'ja'
    redirect_page = request.GET.get('q') # e.g. '/about/'
    # note: redirect_page == reverse('about') is True

    # make sure language is available
    valid = False
    for l in settings.LANGUAGES:
        if l[0] == language:
            valid = True
    if not valid:
        raise Http404(_('選択した言語は利用できません'))

    # Make language the setting for the session
    translation.activate(language)
    response = redirect(redirect_page) # Changing this to use reverse works

    response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language)
    return response

我找到了解决上述问题的方法。 通过将 {{ request.resolver_match.url_name }} 添加到标签的查询参数,然后在视图中对该查询参数调用 reverse 来修复:

Link:

<a href="{% url 'language' 'en' %}?q={{ request.path }}" class="lang-choice btn btn-primary">English</a>

至:

<a href="{% url 'language' 'en' %}?q={{ request.resolver_match.url_name }}" class="lang-choice btn btn-primary">English</a>

然后重构视图:

response = redirect(redirect_page)

收件人:

response = redirect(reverse(redirect_url_name))