当前位置: 首页 > 面试题库 >

尝试从Django模板更改语言的问题

卞俊贤
2023-03-14
问题内容

我需要包括两个按钮或链接,以允许用户在英语和西班牙语之间更改语言。我已经阅读了文档并尝试了以下操作:

<form action="/i18n/setlang/" method="post">{% csrf_token %}
    <input name="language" type="hidden" value="es" />
    <input type="submit" value="ES" />
</form>

但是,每次我单击该按钮时,页面都会重新加载,但语言完全不变。我想念什么吗?

注意:我尚未设置next,因为我只想以所需的语言重新加载当前页面。

如果我使用文档提供的默认格式,则结果是相同的:页面重新加载,但语言未更改:

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
        {% 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>

更新:

经过进一步测试后,我注意到在i18n_patternspatterns中都使用和都存在问题urls.py。目前,我有一个看起来像的文件:

urlpatterns = i18n_patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

而且这似乎不起作用。但是,如果我删除i18n_patterns并将其更改为,patterns那么它似乎可以工作:

urlpatterns = patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

文档说你不必在内部包含它i18n_patterns,所以我认为这应该起作用,但事实并非如此!无论你django.conf.urls.i18n在之前还是之后添加i18n_patterns它,都始终一样。


问题答案:

首先,让我解释一下问题:i18_patterns在你urls.py的语言代码中添加前缀时,如果你调用URL set_language更改语言而未指定next,则默认为当前语言,但使用的是旧的语言代码!因此,该语言恢复了原来的语言!并且,如果你明确指定next,则必须确保一开始就不要包含语言代码。

如果你使用{{ request.path }}或将该页面{{ request.get_full_path }}指定next为当前页面,则此操作将无效,因为它也会返回语言代码

因此,我们如何删除不希望使用的语言代码,以使用时更改的语言重新加载当前页面i18n_patterns?容易,我们只需要切片3个第一个字符(斜杠和两个字符的语言代码)!

这里有两个例子。第一个以选择的形式(使用语言作为选择),另一个以按钮的形式(每种语言)。

我真的希望这对其他人有帮助。你可以复制并粘贴代码,它应该可以工作。但是,如果使用“按钮形式”,则只需将语言设置为所需的语言即可!

从列表中更改语言:

<form action="{% url 'set_language' %}" method="post">
  {% csrf_token %}
  <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
  <select name="language">
    {% 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="Change" />
</form>

将语言更改为按钮:

<form action="{% url 'set_language' %}" method="post">
  {% csrf_token %}
  <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
  <input name="language" type="hidden" value="es" />
  <input type="submit" value="ES" />
</form>


 类似资料:
  • 接下来,我们会详细描述 Django 内置模板语言的语法 (DTL),和 Mako、Jinja2 一样,需要掌握其注释、变量、过滤器、标签、控制语句等等的写法,并用实际的案例进行说明。 1. DTL 基础用法 1.1 变量 DTL 中变量的写法为 {{ variable }}, 这和 Jinja2 非常类似。模版引擎碰到模板变量时,会从上下文 context 中获取这个变量的值,然后用该值替换掉它

  • 我熟悉Java,但只是学习Android编程。我非常喜欢他们的Hello,LinearLayout示例中的颜色栏,所以我一直在尝试将其扩展为一个可以用于我13个月大的孩子的小程序。我让它显示七种颜色的标签和四行。我想做的一件事(因为我会双语),就是能够动态更改区域设置显示语言,而无需退出应用程序,加载新区域设置,然后再次启动应用程序(这很有效,但很乏味)。因此,七个颜色条的标签适合所选语言,但我希

  • 问题内容: 关于扩展django管理模板的一个(不是这样)快速问题。 我试图通过在结果行(row1和row2类)之间添加一个包含一些与该对象相关的对象的中间行来更改特定模型的结果列表(在django lingo中更改列表)。 我搜索了代码,但没有找到一种方法来执行此操作。非常感谢任何指针。代码也将有所帮助。 PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有太多时间可以花时间。另外,dj

  • 我的模板中当前有以下代码: 其中是测试套件的名称,是该测试套件中失败测试用例的列表。我想知道如何才能改变到类似于其中在循环的每次迭代中递增。 UPDATE 在尝试@Gocht的答案后,我有以下代码: 在我的模板标签/get_percentage.py文件中 在我的模板中 我遇到了“字符串索引超出范围”错误。我试图寻找可能的原因,但没有一个答案与自定义模板标记相关。

  • 我最近在一台新电脑上启动了一个 django 项目,最近发现了 pycharm,到目前为止我很喜欢它。我在网上搜索了我的问题,并读到设置 pycharm 来识别 django 模板语法就像设置一样简单 - 好吧,这一切都很好,但这个标签对我来说似乎不存在。 我能看到的最接近的是“实时模板”,但这似乎不是我正在寻找的选项卡。我错过了插件或其他东西吗? 我很抱歉这个小问题,我似乎找不到有同样问题的人。

  • 我正在尝试为我正在工作的网站添加对阿拉伯语的支持,所以目前我的模板是这样的 无论如何,django-allauth 都会尝试从 / 加载模板(在他们的视图中是硬编码的),但我想在必要时基于上下文变量加载 RTL(从右到左)版本,所以我考虑了四个解决方案,但它们对我来说似乎都不够好(我不是说我不会这样做, 我是说我找不到更好的方法,如果有的话) > < li> 在“我的覆盖”中设置一个条件以加载LT