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

Posted

技术标签:

【中文标题】Django 1.5 扩展 admin/change_form.html 对象工具【英文标题】:Django 1.5 extend admin/change_form.html object tools 【发布时间】:2013-08-14 07:49:48 【问题描述】:

我是 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/ 这里的引导主题,但出于这个问题的目的,我目前没有使用它。

【问题讨论】:

【参考方案1】:

问题是% extend % 块中的admin/change_form.html 被解析为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

【讨论】:

我做了这个,修改了我的设置来寻找它,它工作正常。我唯一的评论是我最终得到了 project/app/templates/admin 和 project/templates/admin/app 的模板目录。这在 django 项目中正常吗?这对我来说似乎很乱。 对于管理员,除非您覆盖视图以支持不同的结构,否则您必须遵循它所期望的结构 - 这意味着需要在可以找到它的地方有一个“管理员”目录,并且您的'admin/change_form.html' 的扩展不会引起混淆(就像它最初那样)。如果您愿意,我认为“project/app/templates/admin/app/change_form.html”也可以。就个人而言,我倾向于只在项目级模板目录中找到大多数东西,但这部分只是出于习惯和对独立项目的趋势。【参考方案2】:

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

所以我的扩展看起来像:

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

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

【讨论】:

【参考方案3】:

我发现的最好的方法是使用'..' 进入几个目录,然后返回到只能在 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 源或设置符号链接的技术。

【讨论】:

以上是关于Django 1.5 扩展 admin/change_form.html 对象工具的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.5:扩展 base.html 时,我的 <head> 标签显示在我孩子的 <body> 中

在 Django 1.5 中更改组的应用程序标签

Django 1.5 版:'url' 需要一个非空的第一个参数。 Django 1.5 中的语法改变

django 1.5 管理员内联额外

在 Django 1.5 中建模多个字段查找

Django 1.7 vs Django1.6 vs Django 1.5 [关闭]