如何在Django Admin首页展示各模型的对象数量
问题1:如何正确修改app_list.html而不改动虚拟环境内的Django源文件
- 按照Django模板加载优先级规则,优先从项目配置的模板目录加载模板,你只需要做以下操作:
- 打开项目
settings.py,找到TEMPLATES配置项,确认DIRS列表包含项目根目录的templates文件夹,示例配置:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 确保这行存在 'APP_DIRS': True, 'OPTIONS': { # 其他原有配置保持不变 }, }, ]- 在项目根目录新建
templates/admin文件夹,将虚拟环境中Django自带的app_list.html文件复制到这个文件夹下,后续所有修改都针对这个副本即可,不会影响Django源文件,升级Django版本也不会覆盖你的自定义修改。
- 打开项目
问题2:无法获取模型计数的原因及解决方法
原因
你在模板中拿到的model变量并不是Django ORM的模型类,而是Django Admin预先构造的字典格式的上下文数据,仅包含你打印出来的name/object_name/perms等字段,没有绑定ORM的objects管理器,所以你尝试访问model.count/model.objects等属性都会返回空。
解决方法
我们可以通过自定义模板过滤器来实现计数获取:
- 在你的任意一个已经在
INSTALLED_APPS中注册过的APP下新建templatetags文件夹,在文件夹内新增__init__.py(空文件即可)和admin_count.py两个文件,admin_count.py代码如下:
from django import template from django.apps import apps register = template.Library() @register.filter def get_obj_count(model_dict, app_label): try: # 根据应用标识和模型名获取ORM模型类 model_cls = apps.get_model(app_label, model_dict['object_name']) # 返回模型总条数 return model_cls.objects.count() except Exception: return 0
- 回到你刚才复制到项目里的
app_list.html,在文件顶部加载自定义过滤器:
{% load i18n %} {% load admin_count %} <!-- 新增这行 -->
- 把你之前写的
{{ model.count }}替换为过滤器调用:
<td>Object - {{ model|get_obj_count:app.app_label }}</td>
- 重启Django服务即可看到计数展示。
内容的提问来源于stack exchange,提问作者Cipher
相关产品推荐
相关产品推荐

