没有表单选择和提交按钮的情况下如何使用Django i18n / setlang?

msa*_*aio 2 django django-forms django-i18n

我需要将语言选择器呈现为Django中的无序列表,例如:

<ul>
  ...
  <li><a href="???">EN</a></li>
  <li><a href="???">FR</a></li>
<ul>
Run Code Online (Sandbox Code Playgroud)

我使用的是i18n/set_language不带Django的Django i18n_pattern,如果我使用以下文档中提供的表格,则效果很好:

{% load i18n %}

<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
                {{ language.name_local }} ({{ language.code }})
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>
Run Code Online (Sandbox Code Playgroud)

我想继续使用i18n/set_language,但使用<li>结构,但不使用表单<select>和提交按钮。

可能吗?我该怎么办?

Dan*_*man 5

正如该链接所说明的那样,内置的set_language视图需要一个POST,而您不能通过链接执行该操作(除非使用Javascript)。

但是下一节“ 显式设置活动语言 ”为您提供了编写自己的视图(可以从URL获取参数)所需的所有详细信息。所以:

def set_language_from_url(request, user_language):
    translation.activate(user_language)
    request.session[translation.LANGUAGE_SESSION_KEY] = user_language
    return redirect(' ...somewhere... ')
Run Code Online (Sandbox Code Playgroud)

并给它一个URL:

url(r'/set_language/(?P<user_language>\w+)/$', set_language_from_url, name="set_language_from_url")
Run Code Online (Sandbox Code Playgroud)

现在您可以执行以下操作:

<li><a href="{% url "set_language_from_url" user_language="en" %}">EN</a></li>
<li><a href="{% url "set_language_from_url" user_language="fr" %}">FR</a></li>
Run Code Online (Sandbox Code Playgroud)

等等