【问题标题】:How to remove breadcrumbs in Django admin如何在 Django admin 中删除面包屑
【发布时间】:2014-04-16 05:36:36
【问题描述】:

如何使用 nav-global 进行导航并在 django 管理应用程序中隐藏面包屑。我已经找到了做到这一点的方法,但它们看起来很老套且有问题。我正在寻找一个干净可靠的解决方案。

无效的幼稚方法:

自定义 admin/base_site.html

{% extends "admin/base.html" %}
{% load i18n %}

{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}

{% block branding %}
<h1 id="site-name">{% trans 'Django administration' %}</h1>
{% endblock %}

{% block nav-global %}Some links will go here...{% endblock %}
{% block breadcrumbs %}{% endblock %}

这不起作用,因为 django admin 中的模板(如扩展 base_site.html 的 change_list.html)将为面包屑定义内容,这将覆盖我在 base_site.html 中设置的任何内容。

解决方案 1:CSS

使用 extrastyle 块将以下 css 添加到管理员。这可行,但面包屑仍会生成并出现在 HTML 源代码中。这感觉很hacky。

.breadcrumbs {
    display: none;
}

解决方案 2:覆盖 base.html

覆盖 base.html 并删除面包屑块。孩子们会尝试定义它,但它永远不会存在,因此它永远不会被渲染。这也似乎是一个黑客。覆盖 base.html 也不是一个好主意,因为每个 Django 版本都可以对 base.html 进行许多更改,并且管理应用程序可能会在版本之间中断。

【问题讨论】:

    标签: python django


    【解决方案1】:

    扩展您要呈现空面包屑块的所有模板。您的第一次尝试(您说不起作用)将起作用,只需扩展其他模板即可。比如change_list.html:

    {% extends "admin/change_list.html" %}
    {% block breadcrumbs %}
    {% endblock %}
    

    change_form.html:

    {% extends "admin/change_form.html" %}
    {% block breadcrumbs %}
    {% endblock %}
    

    同样的:

    • 500.html
    • app_index.html
    • change_password.html
    • delete_confirmation.html
    • delete_selected_confirmation.html
    • invalid_setup.html
    • object_history.html

    login.html 和 index.html 有一个空的面包屑块。

    缺点是需要为每个应用应用模板。这意味着重复的模板。如果你想用单个模板做整个项目,你最终会遇到其他黑客:复制完整的原始模板或让模板扩展 /path/to/site-packages/django/contrib/admin/templates/template_name.html

    【讨论】:

    • 这不起作用。试试看。您将获得最大递归深度超出错误。因为 admin/change_list.html 正在尝试扩展 admin/change_list.html。
    • 您还错过了一堆模板。总共有 11 个必须被覆盖。它们是: 500.html app_index.html auth/user/change_password.html change_form.html change_list.html delete_confirmation.html delete_selected_confirmation.html index.html invalid_setup.html login.html object_history.html
    • 用 change_form 试过了。有用。该模板位于应用程序文件夹中。我猜您希望模板的寿命更高,因此它们是项目范围内的。我可以想象 Django 跑圈子,但这在(2009 年)之前是可能的:slideshare.net/lincolnloop/customizing-the-django-admin slide 36。从那以后发生了什么变化?模板加载器?
    • 没错。如果您为每个应用程序都这样做,它将起作用。不过,这将是很多重复,因为它不在项目级别的一个地方。
    【解决方案2】:

    使用 CSS。您还可以隐藏第二个孩子的 app_label。

    .breadcrumbs>ul li:nth-child(2),
    #grp-breadcrumbs>ul li:nth-child(2) {
        display:none;
    }
    

    【讨论】:

      【解决方案3】:

      为了避免递归问题:

      1. 安装 django-apptemplates

        pip install django-apptemplates
        
      2. 将模板加载器添加到您的 settings.py。如果您使用的 Django >= 1.8,请将其添加到 TEMPLATES 设置 (more details in the doc)。

      3. 您现在可以通过在扩展标签中添加app_name: 来覆盖模板:

        {% extends "admin:admin/change_form.html" %}
        {% block breadcrumbs %}
        {% endblock %}
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多