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> 中