自定义 Django 管理页面模板未生效。

20

我一直在尝试让Django的管理页面工作,并使用自定义模板,但一直不成功。我阅读了Django文档和几个博客,它们解释这只是一个简单的步骤,我也以为如此。

目前为止,管理页面可以正常工作,但我的CSS或模板重写没有生效。我的设置如下:

/project_folder/
      manage.py
      settings.py
      urls.py
      __init__.py
      /app/
          views.py
          models.py
          __init__.py
          /templates/
                /admin/
                    base_site.html

在urls.py中,我有以下代码:

(r'^admin/', include(admin.site.urls)),

我假设/admin/base_site.html将覆盖默认的模板,这也能正常工作,因为我不能登录等。但它没有起任何作用。有人知道这里出了什么问题吗?我按照Django教程/指南进行操作,并查看了一些博客以查找答案,但它们都说了同样的事情。

编辑1:我的模板目录设置是正确的。

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates/'),
)

这个工作是正确的,因为我已经使用媒体目录为CSS等在我的整个网站上工作。唯一似乎无法接受模板的只有管理部分。


2
但是这似乎不是正确的模板路径。你有project/templates,但是你的结构显示为project/app/templates。 - Daniel Roseman
仔细阅读文档中的这一部分会有所帮助。 - djvg
5个回答

25

好的,我已经解决了这个问题。这是一个愚蠢的错误,但是我已经花了过去两个小时来处理它。在django.contrib.admin之前必须声明我的应用程序,否则它将不被接受。


3
只是提供信息,我现在正在使用Django 1.6.5进行教程,我不需要这样做就能使其正常工作。 - liquidki
2
很高兴看到我不是唯一遇到这个问题的人(显然至少有15个人)。使用Django 1.10,文档中说如果您自定义了加载器,请更改目录顺序 - 但没有提及应用程序本身。 - John C
在Django 2.2中,只要在settings.TEMPLATES 中正确设置了 DIRS ,就会加载我的自定义模板,无论应用程序声明在哪里,正如文档所述。 - djvg

23

还有一个错误应该在这个练习中避免。这个练习要求更改这个...

<h1 id="site-name"><a href="{% url 'admin:index' %}"> {{ site_header|default:_('Django administration') }} </a></h1>

到这里为止...

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

有一种诱惑只更改字符串常量,但这是不正确的。也就是说,请不要这样做,它将不会改变标题:

<h1 id="site-name"><a href="{% url 'admin:index' %}"> {{ site_header|default:_('Polls Administration') }} </a></h1>

那是我犯的错误,我必须仔细地进行练习来修复它。


我们需要在文件 Projects/mysite/templates/admin/base_site.html 中做这个,对吗? - jeff
1
如果您正在遵循 https://docs.djangoproject.com/en/1.7/intro/tutorial02/ 上的教程,那么是的,@halilpazarlama。 - Rooster
谢谢,通过删除 site_header|default:... 这个东西,它现在可以工作了。但是为什么我不能使用这个上下文变量呢?因为我没有重写 AdminSite 对象而只是模板。如果我重写模板,那么所有原始变量是否都会消失呢?顺便说一下,我没有修改过 AdminSite 对象,但我确实使用了自定义的 ModelAdmin 类。 - John Wang

8
在Django教程的第二部分中,当我进行这一步时,无法识别管理模板。
这是我的解决方法:
使用这个答案中的信息,我打印了TEMPLATE_DIRS的值:
  1. 在命令行中导航到项目的settings.py文件所在的目录(对我来说,这是R:\jeffy\programming\sandbox\python\django\tutorial\mysite\mysite\
  2. 启动交互式shell:python
  3. >>> import settings
  4. >>> settings.TEMPLATE_DIRS,输出['R:\\jeffy\\programming\\sandbox\\python\\django\\tutorial\\mysite\\templates']
因此,这是该项目模板目录的预期位置。管理目录进入其中,base_site.html文件也进入其中。
我遇到的另一个问题是它曾经起作用,但我只改变了<TITLE>字段,所以我没有注意到它。(我以为我在更改主标题。)

1
“admin目录放在那里”,这很容易被忽视。我直接把文件放在模板中,但一直弄不明白为什么它不起作用... - mmdanziger
我还将顶级目录命名为 mysite,以及我的应用程序目录也命名为 mysite。因此,当我打印 TEMPLATE_DIRS 并且它给出 '/Users/username/dev/code/mysite/templates' 时,我读得太快了,认为我做对了,但实际上没有,因为我的模板在 .../code/mysite/mysite/templates 中。 - liquidki
1
顺便提一下,import settings 对我没用,但是 from mysite import settings 可以。 - jeff

6

我在学习Django 1.6.5教程(https://docs.djangoproject.com/en/1.8/intro/tutorial02/)时遇到了同样的问题,但后来发现是自己没有认真阅读。教程要求将以下内容添加到settings.py文件中:

TEMPLATES = [
  {  
      ...
     'DIRS': [os.path.join(BASE_DIR, 'templates')],
      ...
  }

我将要覆盖管理站点的模板文件夹放在应用程序下,就像你的示例一样:

/project_folder/
      manage.py
      settings.py
      urls.py
      __init__.py
      /app/
          views.py
          models.py
          __init__.py
          /templates/
                /admin/
                    base_site.html

有了这个,它不能工作的原因类似于您在评论中提到的问题,我的DIR被评估为project_folder/templates(正如我告诉它的那样)。然后我注意到在教程中明确说明将templates/admin文件夹放在项目级别而不是应用程序级别:

在项目目录(包含manage.py的目录)中创建一个templates目录。模板可以存放在Django可以访问的任何文件系统上。 (Django运行为服务器运行的任何用户。)但是,将模板保留在项目中是遵循的良好惯例。

通过这样做,我有了以下结构:

/project_folder/
      manage.py
      settings.py
      urls.py
      __init__.py 
      /templates/
          /admin/
              base_site.html
      /app/
          views.py
          models.py
          __init__.py

通过这样,一切都按预期工作了(我可以覆盖默认的Django管理页面模板)。
虽然你应该能够将模板放在任何地方并配置Django找到它们,但是将主要的管理模板放在项目级别似乎是有意义的,因为管理站点不是特定于应用程序的,而是适用于整个项目。

我可以确认我遇到了同样的问题,并忘记在settings.DIRS中添加模板位置的路径。我很难找到原因,因为在另一个项目(但使用Django 1.9)中,路径已经设置了,但仍然无法工作,在这种情况下,{{ site_header | default: _('Content Manager Interface') }}需要替换为简单文本。 - Carmine Tambascia

5
请确保您已经在settings.py中设置了TEMPLATE_DIRS到正确的文件夹!

1
我通过打破默认模板 (将其重命名为 base_site.htmlx) 找到了我的问题,错误页面显示我的模板文件夹位置不正确。 - ed209

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接