Django模板自我扩展,扩展Django管理模板时超过最大递归深度

1 投票
1 回答
2518 浏览
提问于 2025-04-18 16:58

我正在按照这些说明进行操作,但遇到了一个运行时错误:

maximum recursion depth exceeded while calling a Python object

我觉得问题出在我创建了一个无限循环的模板查找上。

具体来说,我把base_site.html这个文件从contrib/admin/templates/admin复制到了我的django项目中的templates/admin文件夹里。按照说明,我的项目模板目录在TEMPLATE_DIRS中被引用,而且我确保TEMPLATE_LOADERS的设置是这样的:django会先在TEMPLATE_DIRS指定的目录中查找模板。只有当在TEMPLATE_DIRS中找不到请求的模板时,它才会去django的系统文件中查找。

然而,我的个人管理模板的代码是

{% extends "admin/base_site.html" %}
{% load i18n %}

{% block branding %}
<h1 id="site-name">{% trans 'My Site Title - administration' %}</h1>
{% endblock %}

当然,extends语句是必须的,因为我想要扩展django的base_site.html。但是,由于第一个使用的模板加载器是django.template.loaders.filesystem.Loader,而且我的自定义文件和django默认文件的名字是一样的(也就是“base_site.html”),我猜这个加载器在我的自定义文件上不断循环,最终导致了上面提到的运行时错误。

我该如何解决这个问题呢?

1 个回答

0

我找到了一种解决办法,就是完全覆盖 base_site.html 文件。

我没有去扩展 base_site.html,而是直接把 contrib/admin/templates/admin/base_site.html 的代码复制到我自己的 base_site.html 里,然后修改了相关的部分。这样一来,我实际上是扩展了 base.html,而不是 base_site.html,所以名字冲突的问题就不再出现了。

{% extends "admin/base.html" %}
{% load i18n %}

{% block title %}{{ title }} | {% trans 'My-Custom-Site site admin' %}{% endblock %}

{% block branding %}
<h1 id="site-name">{% trans 'My-Custom-Site site administration' %}</h1>
{% endblock %}

{% block nav-global %}{% endblock %}

不过,这样做的缺点是代码比需要的多了一些,但我对这个解决方案还是挺满意的。

撰写回答