如何在Django管理后台中移除面包屑导航
我想在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 个回答
为了避免递归问题:
首先,安装django-apptemplates这个工具。
pip install django-apptemplates
接着,在你的settings.py文件中添加模板加载器。如果你使用的是Django 1.8及以上版本,就要在TEMPLATES设置里添加它(文档里有更多细节)。
现在,你可以通过在extends标签中添加
app_name:
来覆盖一个模板:{% extends "admin:admin/change_form.html" %} {% block breadcrumbs %} {% endblock %}
使用CSS。你也可以隐藏第二个子元素app_label。
.breadcrumbs>ul li:nth-child(2),
#grp-breadcrumbs>ul li:nth-child(2) {
display:none;
}
要让你想要的所有模板都显示一个空的面包屑导航块,你需要对它们进行扩展。你第一次尝试的做法(你说不管用)其实是可以的,只要把其他模板也扩展一下就行了。比如说,修改 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
。