3

我是 Django 的新手,但我真的很喜欢它。但有时我似乎遇到了一些我似乎没有把事情做对的地方。所以,我正在寻求一些帮助和指导。

我正在尝试为我的一个模型扩展对象工具,以便在历史记录旁边有一个打印按钮。

我的模板如下:

project/app/templates/admin/

成功地扩展了 base_site.html,没有任何问题。

project/app/templates/admin/base_site.html

但是,当我像这样添加 change_form.html 时:

project/app/templates/admin/change_form.html

具有以下内容:

{% extends 'admin/change_form.html' %}

{% block object-tools %}
    <a href="one">One</a>
    <a href="one">Two</a>
{% endblock %}

我得到一个例外:调用 Python 对象时超出了最大递归深度

这似乎我错过了一些非常基本的东西。

我尝试过的事情:

  • {% block %} 的许多变体
  • 扩展 base_site、base 等...
  • 添加 /model 作为路径的一部分 (project/app/templates/admin/model/change_form.html)

我很困惑,也没有成功。

PS:我也在使用这里的引导主题http://riccardo.forina.me/bootstrap-your-django-admin-in-3-minutes/但出于这个问题的目的,我目前没有使用它.

4

3 回答 3

5

问题是admin/change_form.html在你的{% extend %}块中被解决为project/app/templates/admin/change_form.html.

一种解决方案是为您的应用程序创建一个templates名为的子目录 - 可能是project/templates/admin/app/change_form.html.

为了覆盖其中的一个或多个,首先在项目的模板目录中创建一个管理目录。这可以是您在 TEMPLATE_DIRS 中指定的任何目录。

在此管理目录中,创建以您的应用命名的子目录。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template

于 2013-08-12T21:04:42.173 回答
2

那是因为您正在扩展模板本身。我所做的是将我的自定义管理模板放入templates/admin. 然后在同一个文件夹中,我符号链接到 django 管理文件夹(templates/admin/admin)。

所以我的扩展看起来像:

 {% extends 'admin/admin/change_form.html' %}

index.html如果你想沿着这条路走,请确保你也覆盖。

于 2013-08-12T21:02:06.880 回答
0

我发现做到这一点的最好方法是使用'..'几个目录,然后返回到只能在 Django 代码库中找到的目录。

由于 Django 模板类似于"django/contrib/admin/templates/admin",我发现这对我有用:

{% extends "../../admin/templates/admin/change_form.html" %}

如果这仍然会导致与您拥有的其他一些结构发生冲突,您可以更进一步:

{% extends "../../../contrib/admin/templates/admin/change_form.html" %}

甚至:

{% extends "../../../../django/contrib/admin/templates/admin/change_form.html" %}

虽然它有点 hacky,但至少通过执行上述操作,您不必使用其他一些涉及复制 django 源或设置符号链接的技术。

于 2014-05-16T13:20:52.247 回答