如何在Django管理后台中移除面包屑导航

4 投票
3 回答
3832 浏览
提问于 2025-04-17 21:54

我想在Django的管理后台中使用nav-global进行导航,并隐藏面包屑导航。我找到了一些方法,但感觉都不太靠谱,想要一个干净可靠的解决方案。

简单的方法但不奏效:

自定义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管理后台中的一些模板,比如change_list.html,会继承base_site.html,并为面包屑导航定义内容,这样就会覆盖我在base_site.html中设置的内容。

解决方案1:使用CSS

通过extrastyle块向管理后台添加以下CSS。这种方法有效,但面包屑导航依然会被生成,并出现在HTML源代码中。这种感觉有点像是变通。

.breadcrumbs {
    display: none;
}

解决方案2:重写base.html

重写base.html并移除面包屑导航的部分。子模板会尝试定义它,但因为它不存在,所以不会被渲染出来。这种方法也感觉像是变通。而且重写base.html并不是个好主意,因为每次Django更新时,base.html可能会有很多变化,这样管理后台可能会在更新后出现问题。

3 个回答

0

为了避免递归问题:

  1. 首先,安装django-apptemplates这个工具。

    pip install django-apptemplates
    
  2. 接着,在你的settings.py文件中添加模板加载器。如果你使用的是Django 1.8及以上版本,就要在TEMPLATES设置里添加它(文档里有更多细节)。

  3. 现在,你可以通过在extends标签中添加app_name:来覆盖一个模板:

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

使用CSS。你也可以隐藏第二个子元素app_label。

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

要让你想要的所有模板都显示一个空的面包屑导航块,你需要对它们进行扩展。你第一次尝试的做法(你说不管用)其实是可以的,只要把其他模板也扩展一下就行了。比如说,修改 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

撰写回答