如何将更改语言下拉列表添加到Django(1.10)admin?

时间:2016-08-28 10:40:44

标签: python django django-admin multilingual django-multilingual

我计划在管理页面中添加更改语言下拉列表。 根据{{​​3}}和this code
我复制base_site.html并将其复制到myapp/templates/admin,我创建一个名为change_language.html的html文件并在其中编写此代码:

{% load i18n %}
/ {% trans 'Change language' %}
<form action="/i18n/setlang/" method="post" style="display: inline;">
  <div style="display: inline;">
    <select name="language" onchange="javascript:form.submit()">
      {% for lang in LANGUAGES %}
        <option value="{{ lang.0 }}"{% ifequal LANGUAGE_CODE lang.0 %} selected="selected"{% endifequal %}>{{ lang.1 }}</option>
      {% endfor %}
    </select>
  </div>
</form>

我在此文件的顶部添加了{% extends 'admin/base_site.html' %},注意到了 我添加了{% extends 'admin/base.html' %},再次注意到了 所有提示和答案都说我们应该在<div id="user-tools">的第25行更改名称base.html,但在Django 1.10中,它会使用不同的工作人员进入第31行。 im kinnda因为我读了很多不同的工作人员,而且他们中的任何一个都没有为我工作。任何知道我做错了什么?
这是我的中间件:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

模板设置:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join(BASE_DIR,'templates'),
    ],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

3 个答案:

答案 0 :(得分:2)

在您的templates / admin文件夹中,确保该文件名为 base_site.html (否则将不会覆盖默认的base_site)。

确保从django-repo

复制最新版本的文件

最重要的是:验证您是否扩展了管理员base.html(您的base_site.html应该以{{1​​}}开头)

您现在可以添加表单(例如添加到页脚):

{% extends "admin/base.html" %}

请参阅base.html以找到适合您表单的块。

您还需要将i18n urls添加到您的网址设置

{% extends "admin/base.html" %} {% load i18n %} {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> {% endblock %} {% block nav-global %}{% endblock %} {% block footer %} <div id="footer"> <form action="/i18n/setlang/" method="post"> {% csrf_token %} <select name="language"> {% for lang in LANGUAGES %} <option value="{{ lang.0 }}" {% ifequal lang.0 request.LANGUAGE_CODE %} selected="yes" {% endifequal %} >{{ lang.1 }}</option> {% endfor %} </select> <input type="submit" value="{% trans 'Change language' %}" /> </form> </div> {% endblock %}

如果您真的想使用javascript提交表单,您还需要获取并提交表单的csrf标记。 django docs涵盖了这个主题非常全面。

答案 1 :(得分:1)

我猜你正在混合你在互联网上找到的两个答案。其中一个从管理模板中复制并更改了几个文件,有效地将它们覆盖在程序的参考文件中。第二个扩展了管理员的模板。你应该完全实现其中一个。

答案 2 :(得分:1)

除了Kim的回答,您还应该在django设置django.template.context_processors.i18n中添加 i18n 上下文处理器,以便能够访问模板中的 LANGUAGES 变量。 / p>