如何在Django管理界面显示模型的总记录数

12 投票
3 回答
3899 浏览
提问于 2025-04-15 23:58

有没有简单的方法可以让Django后台管理模块中的模型列表显示记录或对象的数量呢?

我找到了一些方法,可以在列表展示页面中显示相关对象的数量(而且我可以在页面底部的分页部分看到总数),但是还没有找到一个好的方法来在模型列表的层面上显示记录的数量。

3 个回答

1

我没有找到什么好的方法来在主管理页面上添加模型的计数,但这是我最终使用的解决方案。

简单来说,我在信号的 post_delete 和 post_save 方法中计算每个模型的数量,把这些变量存储在一个自定义请求中(用一个映射),然后在扩展的管理页面 index.html 中通过简单的 if 判断来显示每个需要的模型的计数。

扩展的 templates/admin/index.html

{% if model.perms.change %}
    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }} 
    {% if model.name == "Mymodel1_verbose_name_plural" %} ({{ MODELS_COUNT.Mymodel1}}) {% endif %}
    </a></th>
{% else %}

我在 util/context_processors.py 中的自定义请求:

from myproject import settings

def myproject(request):
    return {
        'request' : request,
        'MODELS_COUNT' : settings.MODELS_COUNT
    }

在我的 settings.py 中:

MODELS_COUNT = {
      'Mymodel1': None,
      'Mymodel2': None       
}

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myproject.util.context_processors.myproject',
)

myproject.__init__.py 中:

from django.db.models.signals import post_save, post_delete

def save_mymodel1_count(sender, instance=None, **kwargs):
    if kwargs['created']:
        settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count()
def delete_mymodel1_count(sender, instance=None, **kwargs):
    settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count()
settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count()

post_save.connect(save_mymodel1_count, sender=Mymodel1)
post_delete.connect(delete_mymodel1_count, sender=Mymodel1)

如果你有很多模型,我建议你把这个转变成一个更通用的解决方案。

3
from django import template
from django.db.models.loading import get_model

register = template.Library()

@register.simple_tag()
def get_model_count(admin_url):
  app_label, model_name = admin_url.split('/')[:2]
  return get_model(app_label, model_name, seed_cache=False).objects.count()

然后从 "django's contrib/admin/templates/index.html" 复制并覆盖 "/templates/admin/index.html"。

在顶部添加:

{% load NAME_OF_YOUR_TAG_FILE %}

在模型名称后面或者其他地方添加以下调用:

{% get_model_count model.admin_url %}

这样做非常适合这个使用场景。你完成了!

3

我建议你看看 models.Manager 这个类。创建一个 Manager 的子类可以让你给模型添加一些表级的功能。Manager 方法可以返回你想要的任何数据,Django 的数据库 API 文档里有一个有趣的例子,你可以去看看。然后,你可以通过在模型里添加一个 admin 内部类,把这些功能引入到管理界面中。

撰写回答