django:我如何实际覆盖管理站点模板

Posted

技术标签:

【中文标题】django:我如何实际覆盖管理站点模板【英文标题】:django: how do I actually override admin site template 【发布时间】:2017-01-01 02:42:42 【问题描述】:

我知道这个问题被问了好几次,但我基本上浏览了所有关于堆栈溢出的帖子,但仍然无法让它工作。现在我只是想简单地更改管理站点标题。我有以下内容:

#base_site.html
% extends "admin/base_site.html" %

% block title % title  |  site_title|default:_('NEW TITLE') % endblock %

% block branding %
<h1 id="site-name"><a href="% url 'admin:index' %"> site_header|default:_('NEW TITLE') </a></h1>
% endblock %

% block nav-global %% endblock %

我试着把它放进去

my_site/templates/admin/base_site.html,

my_site/templates/admin/my_app/base_site.html,以及

my_site/my_app/templates/admin/base_site.html,

但这些都不起作用。

settings.py:
TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
            'loaders': [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ],
        ,
    ,
]

我也尝试直接更改 django\contrib\admin\templates\admin\base_site.html 但仍然没有任何反应。

我现在真的很沮丧,肯定需要一些帮助,谢谢

更新: 其实我发现本地模板确实有效果。

就像这里一样,最上面的白条显示“#base_site.html!!@#”,这是我在 my_site/templates/admin/base_site.html 中偶然添加的评论。所以它有点工作,但我仍然不明白为什么我不能更改网站标题。

【问题讨论】:

如果在您编辑源模板时它无法正常工作,那么就会发生一些非常奇怪的事情。你确定你是从你认为你所在的地方运行服务器吗? @DanielRoseman 是的,我对此非常确定。所以我现在真的为此摸不着头脑 docs.djangoproject.com/en/1.10/ref/contrib/admin/… 这似乎与:***.com/questions/4938491/… 需要为 site_header 和 site_title 字段设置一个新值。 我现在面临同样的问题。知道如何在自定义模板中引入用户工具“欢迎”“注销”等吗? 【参考方案1】:

在 settings.INSTALLED_APPS 中的“Django.contrib.admin”上方添加您的 Django 应用程序。顺序很重要。

使用 my_site/my_app/templates/admin/base_site.html

将您的应用放在您之前定义此模板的位置 'django.contrib.admin',在 INSTALLED_APPS 中

source link

【讨论】:

谢谢,但我很确定我已经做了所有这些,但还是徒劳 我现在不知道加载顺序在 INSTALLED_APPS 中至关重要。我把我的应用放在了 3.party 包之上,现在它正在使用我的自定义模板,谢谢! 这是我的问题,很难找到。 @jturi 这解决了我的问题,谢谢!如果您拥有 base_site.html 的模板文件夹位于应用程序内,则必须在 django.contrib.admin 之前包含该应用程序。【参考方案2】:

首先打开你的 settings.py 并添加一个模板文件夹:

TEMPLATES = [

    'DIRS': [
        '/path/to/your/django-project/templates', # Absolute Path
        # os.path.join(BASE_DIR, 'templates') # Relative Path
    ],
    ... 

然后将文件 base_site.html 移动到以下目录。 将结构保留在文件系统上很重要。

/path/to/your/django-project/templates/admin/base_site.html

base_site.html 的内容:

% extends "admin/base_site.html" %

% block title % title  |  site_title|default:_('NEW TITLE') % endblock %

% block branding %
<h1 id="site-name"><a href="% url 'admin:index' %">Your new Title</a></h1>
% endblock %

% block nav-global %% endblock %

Django Documentation - Overriding Admin Site

希望对您有所帮助。

【讨论】:

【参考方案3】:

所以你应该删除包括花括号的内容,然后只写你想要的文本。

删除:` site_title|default:_('NEW TITLE') ` 写入:NEW TITLE 删除:` site_header|default:_('NEW TITLE' ` 写入:NEW TITLE

还要确保将文件夹 (templates/admin) 放在项目的根目录中。根目录是所有应用文件夹的容器,也是 manage.py 文件。

换句话说,您要创建的“templates”文件夹应该与manage.py文件处于同一级别。

您的文件夹结构应如下所示:

我的网站/ 模板/ 行政/ base_site.html 管理.py 我的网站/ __init__.py 设置.py 网址.py wsgi.py ... ...

【讨论】:

【参考方案4】:

我不确定我是否理解正确。但您可以通过以下方式轻松更改标题:

在“urls.py”文件中

from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    .......
]

admin.site.site_header = 'My New Title'
admin.site.site_title = 'My New Title'

那么它应该会为你完成工作。

【讨论】:

我喜欢把admin.site.site_header = 'My New Title'admin.site.site_title = 'My New Title'放在Django app的admin.py中【参考方案5】:

要更改 Django Admin 站点标题,您可以在 Django 应用的 admin.py 中添加这两行:

from django.contrib import admin

# change Django admin title
admin.site.site_title = 'My Blog Admin'

# change Django admin site header
admin.site.site_header = 'My Blog Admin'

【讨论】:

以上是关于django:我如何实际覆盖管理站点模板的主要内容,如果未能解决你的问题,请参考以下文章

上下文未传递给被覆盖的模板

Django - 覆盖管理站点的登录表单

未覆盖管理模板上的阻止内容

如何在 django 管理面板中完全自定义 sidebar_menu?

有没有一种简单的方法可以完全自定义 Django 管理站点以显示不是字段的变量?

Django:当它们已经被覆盖时不能覆盖管理模板?