如何在Django管理后台的所有视图中显示app_list?

2 投票
2 回答
4014 浏览
提问于 2025-04-17 18:06

我正在修改网站的Django后台管理界面。在默认的首页上,他们有一个叫做app_list的变量,这个变量包含了所有的应用程序和它们的模型。

但是在其他的视图中,app_list这个变量并不可用。我希望在所有的视图中都能使用这个变量,这样我就可以在侧边栏中显示它,方便点击。

在这个文件中

https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L382

他们有这样的代码

app_list = list(six.itervalues(app_dict))

但是我该如何在更改列表页面中使用这个变量呢?

2 个回答

0

覆盖 app_index.html 文件

{% extends "admin/index.html" %}
{% load i18n %}
{% load url from future %}

{% if not is_popup %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo;
{% for app in app_list %}
{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
{% endfor %}
</div>
{% endblock %}
{% endif %}

{% block sidebar %}{% endblock %}
4

我知道这个回答晚了7年,但我想指出一些事情,因为我也经历过类似的情况。如果你的目的是获取所有的应用程序(应用程序列表)及其对应的模型,那么你可以使用 available_apps,而不是 app_list。因为 available_apps 可以在所有的管理页面中访问(可以查看下面的 site.py 代码)

def each_context(self, request):
    """
    Return a dictionary of variables to put in the template context for
    *every* page in the admin site.
    For sites running on a subpath, use the SCRIPT_NAME value if site_url
    hasn't been customized.
    """
    script_name = request.META['SCRIPT_NAME']
    site_url = script_name if self.site_url == '/' and script_name else self.site_url
    return {
        'site_title': self.site_title,
        'site_header': self.site_header,
        'site_url': site_url,
        'has_permission': self.has_permission(request),
        'available_apps': self.get_app_list(request), #this one
        'is_popup': False,
    }

撰写回答