【问题标题】:Django 1.5 extend admin/change_form.html object toolsDjango 1.5 扩展 admin/change_form.html 对象工具
【发布时间】: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/ 这里的引导主题,但出于这个问题的目的,我目前没有使用它。

【问题讨论】:

    标签: python django recursion django-templates django-admin


    【解决方案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 源或设置符号链接的技术。

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 2014-11-30
        • 2020-12-14
        • 2015-12-07
        • 2021-02-05
        • 2018-07-23
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多