Django模板自我扩展,扩展Django管理模板时超过最大递归深度
我正在按照这些说明进行操作,但遇到了一个运行时错误:
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 %}
不过,这样做的缺点是代码比需要的多了一些,但我对这个解决方案还是挺满意的。