2

我打算在我的管理页面中添加更改语言下拉菜单。根据此代码如何扩展管理页面
我将其复制base_site.html并复制到myapp/templates/admin,我创建一个名为的 html 文件change_language.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 行。我有点迷失了,因为我在每个地方都阅读了许多不同的员工,而且他们都不适合我。任何人都知道我在哪里做错了吗?
这是我的中间件:

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',
        ],
    },
},
]
4

3 回答 3

2

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

于 2018-11-05T07:03:41.807 回答
2

在您的模板/管理文件夹中,确保文件名为base_site.html(否则默认的 base_site 将不会被覆盖)。

确保从django-repo复制最新版本的文件。

最重要的是:验证您扩展了管理员 base.html(您的 base_site.html 应该以 开头{% extends "admin/base.html" %}

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

{% 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 %}

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

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

url(r'^i18n/', include('django.conf.urls.i18n')),

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

于 2017-09-03T15:58:48.077 回答
1

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

于 2016-08-28T13:36:31.540 回答