Django 1.5扩展admin/change_form.html对象工具

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)
我感到困惑并且没有成功。
P.S.:我也使用了来自此处的引导主题http://riccardo.forina.me/bootstrap-your-django-admin-in-3-minutes/,但出于解决此问题的目的,我目前没有使用它。
3个回答

5
问题是您在{% extend %}块中的admin/change_form.html解析为project/app/templates/admin/change_form.html
一个解决方案是在templates目录下创建一个以您的应用程序命名的子目录 - 可能是project/templates/admin/app/change_form.html

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

在此admin目录中,创建以您的应用程序命名的子目录。

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

我做了这个,修改了我的设置来寻找它,然后它正确地工作了。我唯一的评论是,我最终得到了一个项目/应用程序/模板/管理和项目/模板/管理/应用程序的模板目录。在Django项目中,这是正常的吗?对我来说看起来很混乱。 - warpedspeed
对于管理员而言,除非您覆盖视图以支持不同的结构,否则必须遵循它所期望的结构 - 这意味着需要在某个地方有一个“admin”目录,它可以找到,并且您的“admin/change_form.html”的扩展不会导致混淆(就像最初一样)。如果您愿意,我认为“project/app/templates/admin/app/change_form.html”也可以。个人而言,我倾向于将大多数内容放在项目级别的模板目录中,但这部分是出于习惯和自包含项目的倾向。 - Peter DeGlopper

2

这是因为您正在使用模板自身进行扩展。我的做法是将自定义管理模板放在templates/admin中。然后在同一文件夹中,我会创建一个符号链接到Django管理文件夹(templates/admin/admin)。

因此,我的扩展看起来像:

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

如果您想走这条路,请确保同时覆盖index.html


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" %}

虽然这有点狡猾,但是通过上述方法,您就不必使用涉及复制Django源码或设置符号链接的其他技术了。


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