【问题标题】:how to add change language dropdown to Django(1.10) admin?如何将更改语言下拉菜单添加到 Django(1.10)管理员?
【发布时间】:2017-01-04 13:13:21
【问题描述】:

我打算在我的管理页面中添加更改语言下拉菜单。 根据this codeHow to extend admin page
我复制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' %} ,再次注意发生。
所有提示和答案都说我们应该在base.html 的第 25 行更改名称&lt;div id="user-tools"&gt;,但在 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',
        ],
    },
},
]

【问题讨论】:

  • 你能发布你的中间件和模板引擎吗?
  • 当然。我更新我的问题亲爱的@rfkortekaas

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


【解决方案1】:

在您的模板/管理文件夹中,确保文件名为 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 urls 添加到您的网址设置中

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

如果您真的想使用 javascript 提交表单,您还需要获取并提交表单的 csrf 令牌。 django docs 涵盖的这个话题相当全面。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!我只是在查看管理站点和语言列表,它是空的。添加后我得到了列表
    【解决方案3】:

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

    【讨论】:

    • 你能说得更具体些吗?如果我想复制 base.html 文件,我应该把它复制到哪里?它是如何工作的?
    • 您的第一个链接建议复制此链接并更改第 25 行(或本示例中的第 28 行)tp 包含您的新 html 文件 (change_language.html)
    • 您的第二个答案建议创建另一个 html 文件(例如 base_site.html,因此它不会与 base.html 冲突)并在原始 base.html 中扩展一个块。在这种情况下,您应该用新代码替换 userlinks 块。
    • 您知道如何访问语言吗?在我的change_languages.html 中,select 没有选项?你能帮助我吗 ? @navit
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多