如何在django admin中显示模型的总记录数

时间:2010-06-15 01:52:58

标签: python django django-models django-admin

是否有一种简洁的方法可以让模型的记录/对象数出现在django管理模块的主模型列表中?

我已经找到了在list_display页面中显示集合中相关对象计数的技术(我可以看到底部的分页部分中的总数),但是没有看到一个简洁的方式来显示在模型列表级别记录计数。

3 个答案:

答案 0 :(得分:3)

我会查看models.Manager类。 Manager的子类允许您向模型添加表级功能。 Manager方法可以返回您想要的任何数据,Django DB API documentation中有一个有趣的示例。然后,您可以通过向模型添加管理内部类来将其拉入管理员。

答案 1 :(得分: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的contrib / admin / templates / index.html”复制并覆盖“/templates/admin/index.html”。

在顶部添加:

{% load NAME_OF_YOUR_TAG_FILE %}

在型号名称后面的地方添加以下调用:

{% get_model_count model.admin_url %}

这非常适合这个用例。你做完了!

答案 2 :(得分:1)

我没有找到任何在主管理页面中添加模型数量的好方法,但这是我最终使用的解决方案。

简而言之,我用post_delete和post_save方法计算每个模型的计数,将变量存储在自定义请求中(在地图中),并通过简单地检查每个所需的if来在扩展的admin index.html中显示它们模型。

扩展 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)

如果您有很多型号,我建议您使用更通用的解决方案进行转换。