【问题标题】:Django Admin - change header 'Django administration' textDjango Admin - 更改标题“Django 管理”文本
【发布时间】:2011-06-23 17:38:32
【问题描述】:

如何更改 django 管理标头中的“Django 管理”文本?

“自定义管理员”文档中似乎没有涵盖它。

【问题讨论】:

标签: python django django-admin


【解决方案1】:

从 Django 1.7 开始,您不需要覆盖模板。您现在可以在自定义AdminSite 上实现site_headersite_titleindex_title 属性,以便轻松更改管理站点的页面标题和标题文本。创建一个 AdminSite 子类并将您的实例挂接到您的 URLconf:

admin.py:

from django.contrib.admin import AdminSite
from django.utils.translation import ugettext_lazy

class MyAdminSite(AdminSite):
    # Text to put at the end of each page's <title>.
    site_title = ugettext_lazy('My site admin')

    # Text to put in each page's <h1> (and above login form).
    site_header = ugettext_lazy('My administration')

    # Text to put at the top of the admin index page.
    index_title = ugettext_lazy('Site administration')

admin_site = MyAdminSite()

urls.py:

from django.conf.urls import patterns, include
from myproject.admin import admin_site

urlpatterns = patterns('',
    (r'^myadmin/', include(admin_site.urls)),
)

更新:正如 oxfn 所指出的,您可以直接在 urls.pyadmin.py 中设置 site_header,而无需子类化 AdminSite

admin.site.site_header = 'My administration'

【讨论】:

  • 当我尝试访问 /myadmin/ 时,这会引发“您无权编辑任何内容”错误消息。看起来我应该调用 .autodiscover,但 Django 1.7 应该自动调用它。有什么线索吗?
  • @DavidArcos 您需要在您创建的新admin_site 注册您的模型。喜欢admin_site.register(MyModel, ModelAdmin)
  • 如果还应该自定义 django.auth.views 中的标头(这取决于 admin/base_site.html 模板,例如 password_reset),那么在 url 中也应该使用 extra_context:例如url(r'^password_reset/$', auth_views.password_reset, name='admin_password_reset', kwargs={'extra_context': {'site_header': "My administration"}})
  • 关于这种方式需要了解的是,它仅适用于标准管理页面,如果您在另一个应用程序上添加自己的管理页面(扩展管理基本模板),它们将始终采用默认的“Django Administration”标题。
  • @oxfn 如果我有多个应用程序,admin.site.site_header 配置其中app*/admin.py 会生效吗?
【解决方案2】:

有一种简单的方法来设置管理站点标题 - 像这样将其分配给 urls.py 中的当前管理实例

admin.site.site_header = 'My admin'

或者可以在单独的方法中实现一些头部构建魔法

admin.site.site_header = get_admin_header()

因此,在简单的情况下,不需要子类AdminSite

【讨论】:

  • 第一种方法奏效了。我现在真的不知道是什么问题。谢谢
  • 如果您要更改标题,您可能还想更改站点标题,这可以通过:admin.site.site_title = 'My site admin' 来完成。
  • 这是一个要添加到urls.py的导入字符串:from django.contrib import admin
  • 希望我先找到这个...听了文档,我将AdminSite 子类化并花了一段时间尝试使其与autodiscover() 一起工作,但最终我自己想到了这个解决方案。我实际上在admin.py 中有我的覆盖,我认为它更干净,因为它与所有其他与管理相关的逻辑一起保存
  • 查看docs.djangoproject.com/en/1.11/ref/contrib/admin/…可以更改的所有属性列表
【解决方案3】:

更新:如果您使用的是 Django 1.7+,请参阅answer below


2011 年的原始答案: 您需要创建自己的管理员base_site.html 模板来执行此操作。最简单的方法是创建文件:

/<projectdir>/templates/admin/base_site.html

这应该是original base_site.html 的副本,除了放入您的自定义标题:

{% block branding %}
<h1 id="site-name">{% trans 'my cool admin console' %}</h1>
{% endblock %}

为此,您需要为您的项目设置正确的设置,即在settings.py:

  • 确保将/projectdir/templates/ 添加到TEMPLATE_DIRS
  • 确保将django.template.loaders.filesystem.Loader 添加到TEMPLATE_LOADERS

See docs for more information on settings.py.

【讨论】:

  • 另请注意,您可以在/&lt;projectdir&gt;/templates/admin/base_site.html 中使用{% extends "admin/base.html" %},并简单地重新定义您需要的块,即{% block branding %}...{% endblock %}
  • 即使已经很老了,我想补充一点,您必须将您的应用程序放在您定义此模板的位置,在 INSTALLED_APPS 中的 'django.contrib.admin' 之前
  • 在 django 1.6 python 3.3 中,即使您不添加 TEMPLATE_LOADER 设置,上述操作也有效。看来TEMPLATE_DIR 就够了
  • 从 1.7 开始已经过时了。请参阅 Reto Aebersold 的回答。
  • 在 url.py 中试试这个 admin.site.site_header = '我的管理' admin.site.index_title = ('我的管理员') admin.site.site_title = ('我的管理员页面')
【解决方案4】:

urls.py 中,您可以覆盖三个最重要的变量:

from django.contrib import admin

admin.site.site_header = 'My project'                    # default: "Django Administration"
admin.site.index_title = 'Features area'                 # default: "Site administration"
admin.site.site_title = 'HTML title from adminsitration' # default: "Django site admin"

参考:Django documentation on these attributes

【讨论】:

  • 这应该是这个问题的正确答案。这是最恰当和优雅的解决方案。
【解决方案5】:

Django 1.8.3 中基于此问题的答案的简单完整解决方案。

settings.py 中添加:

ADMIN_SITE_HEADER = "My shiny new administration"

urls.py 中添加:

from django.conf import settings
admin.site.site_header = settings.ADMIN_SITE_HEADER

【讨论】:

  • 有比使用 urls.py 更好的地方吗?
  • @VenkatKotra 是的,在admin.py。如果您还没有,只需创建它,不要忘记添加from django.contrib import admin
  • 推荐的导入设置方式是通过-“from django.conf import settings”(见docs.djangoproject.com/en/1.9/topics/settings/…
  • 没有 Django 查看名为 ADMIN_SITE_HEADER 的设置,这里唯一重要的是 urls.py 中的行
  • 我按照这种方式首先在设置中定义了名称,然后如上所述导入到 url.py 中。我对登录名和 html 标题做了同样的事情,这三个都运行良好。 ==> 在 url.py 中: {{ from django.conf import settings }} admin.site.site_header = settings.ADMIN_SITE_HEADER admin.site.site_title = settings.ADMIN_SITE_TITLE admin.site.index_title = settings .ADMIN_SITE_INDEX
【解决方案6】:

最简单的方法 确保你有

from django.contrib import admin

然后将这些添加到您的主应用程序的url.py 底部

admin.site.site_title = "Your App Title"
admin.site.site_header = "Your App Admin" 

【讨论】:

    【解决方案7】:

    对于 Django 2.1.1,将以下行添加到 urls.py

    from django.contrib import admin
    
    # Admin Site Config
    admin.sites.AdminSite.site_header = 'My site admin header'
    admin.sites.AdminSite.site_title = 'My site admin title'
    admin.sites.AdminSite.index_title = 'My site admin index'
    

    【讨论】:

      【解决方案8】:

      希望聚会还不算太晚,最简单的方法是编辑 admin.py 文件。

      admin.site.site_header = 'your_header'
      admin.site.site_title = 'site_title'
      admin.site.index_title = 'index_title'
      

      【讨论】:

        【解决方案9】:

        正如您在templates 中看到的,文本是通过本地化框架传递的(注意trans 模板标签的使用)。您可以更改翻译文件以覆盖文本,而无需制作您自己的模板副本。

        1. mkdir locale

        2. ./manage.py makemessages

        3. 编辑locale/en/LC_MESSAGES/django.po,添加以下行:

          msgid "Django site admin"
          msgstr "MySite site admin"
          
          msgid "Django administration"
          msgstr "MySite administration"
          
        4. ./manage.py compilemessages

        https://docs.djangoproject.com/en/1.3/topics/i18n/localization/#message-files

        【讨论】:

        • 这是一个糟糕的解决方案。覆盖翻译字符串只是一个糟糕的主意。
        【解决方案10】:

        Django 2.0 开始,您只需在 url.py 中添加一行并更改名称。

        # url.py
        
        from django.contrib import admin 
        admin.site.site_header = "My Admin Central" # Add this
        

        适用于旧版本的 Django。 ( 您需要编辑admin/base_site.html

        改变这一行

        {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
        

        {% block title %}{{ title }} | {{ site_title|default:_('Your Site name Admin Central') }}{% endblock %}
        

        您可以通过

        查看您的django版本
        django-admin --version
        

        【讨论】:

          【解决方案11】:

          admin.py:

          from django.contrib.admin import AdminSite
          
          AdminSite.site_title = ugettext_lazy('My Admin')
          
          AdminSite.site_header = ugettext_lazy('My Administration')
          
          AdminSite.index_title = ugettext_lazy('DATA BASE ADMINISTRATION')
          

          【讨论】:

          • from django.utils.translation import ugettext_lazy 不要忘记添加这一行。
          【解决方案12】:

          只需转到 admin.py 文件并在文件中添加这一行:

          admin.site.site_header = "My Administration"

          【讨论】:

            【解决方案13】:

            有两种方法可以做到这一点:

            1] 通过在django/contrib/admin/templates/admin/base_site.html 中覆盖base_site.html: 以下是base_site.html的内容:

            {% extends "admin/base.html" %}
            
            {% 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 %}
            

            在上面的代码 sn-p 中编辑 site_title 和 site_header。此方法有效,但不推荐使用,因为它是静态更改。

            2] 通过在项目目录的urls.py 中添加以下行:

            admin.site.site_header = "AppHeader"
            admin.site.site_title = "AppTitle"
            admin.site.index_title = "IndexTitle"
            admin.site.site_url = "Url for view site button"
            

            推荐这种方法,因为我们可以在不编辑base_site.html的情况下更改站点标题、站点标题和索引标题。

            【讨论】:

              【解决方案14】:

              首先,您应该将 templates/admin/base_site.html 添加到您的项目中。这个文件可以安全地被覆盖,因为它是 Django 开发人员打算用于稍微自定义您的管理站点的确切目的的文件。下面是在文件中放入内容的示例:

              {% extends "admin/base.html" %}
              {% load i18n %}
              
              {% block title %}{{ title }} | {% trans 'Some Organisation' %}{% endblock %}
              
              {% block branding %}
              <style type="text/css">
                #header
                {
                  /* your style here */
                }
              </style>
              <h1 id="site-name">{% trans 'Organisation Website' %}</h1>
              {% endblock %}
              
              {% block nav-global %}{% endblock %}
              

              这是常见的做法。但是我注意到在此之后我仍然在主管理索引页面上留下了一个令人讨厌的“站点管理”。而且这个字符串不在任何模板中,而是在管理视图中设置。幸运的是,它很容易改变。假设您的语言设置为英语,请从您的项目目录运行以下命令:

              $ mkdir locale
              $ ./manage.py makemessages -l en
              

              现在打开文件 locale/en/LC_MESSAGES/django.po 并在标题信息之后添加两行(本示例的最后两行)

              "Project-Id-Version: PACKAGE VERSION\n"
              "Report-Msgid-Bugs-To: \n"
              "POT-Creation-Date: 2010-04-03 03:25+0200\n"
              "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
              "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
              "Language-Team: LANGUAGE <LL@li.org>\n"
              "MIME-Version: 1.0\n"
              "Content-Type: text/plain; charset=UTF-8\n"
              "Content-Transfer-Encoding: 8bit\n"
              
              msgid "Site administration"
              msgstr "Main administration index"
              

              在此之后,请记住运行以下命令并重新加载项目的服务器:

              $ ./manage.py compilemessages
              

              来源:http://overtag.dk/wordpress/2010/04/changing-the-django-admin-site-title/

              【讨论】:

              • 链接到外部网站被认为是错误的,因为链接可能会变坏。我们鼓励您在此处重写网站上的答案。
              • 我重写了答案,以防你不想去网站之外。
              【解决方案15】:

              您可以在您的主要urls.py 中使用以下这些行

              您可以在要显示的引号中添加文本

              要替换文本 Django admin 使用 admin.site.site_header = ""

              要替换文本站点管理使用admin.site.site_title = ""

              要替换站点名称,您可以使用admin.site.index_title = ""

              要替换查看站点按钮的 url,您可以使用 admin.site.site_url = ""

              【讨论】:

                【解决方案16】:

                使用format_html 允许呈现html,否则将只是纯文本。

                在您的主要urls.py 文件中添加以下内容(urls.py 位于settings.py 所在的目录中):

                from django.contrib import admin
                from django.utils.html import format_html
                
                site_header = 'Your html snippet'
                admin.site.site_header = format_html(site_header)
                

                【讨论】:

                  【解决方案17】:

                  您无需为此工作更改任何模板,您只需更新项目的settings.py。转到settings.py 的底部并定义它。

                  admin.site.site_header = 'My Site Admin'
                  

                  通过这种方式,您将能够更改 Django 管理员的标题。此外,您可以在以下链接中阅读有关 Django Admin 自定义和设置的更多信息。

                  Django Admin Documentation

                  【讨论】:

                    【解决方案18】:

                    您可以使用AdminSite.site_header 更改该文本。这是docs

                    【讨论】:

                      【解决方案19】:

                      您只需覆盖admin/base_site.html 模板(从django.contrib.admin.templates 复制模板并放入您自己的管理模板目录)并替换branding 块。

                      【讨论】:

                        【解决方案20】:

                        因为我只在我的应用程序中使用管理界面,所以我把它放在 admin.py 中:

                        admin.site.site_header = 'My administration'
                        

                        【讨论】: