【问题标题】:How to display total record count against models in django admin如何在 django admin 中显示模型的总记录数
【发布时间】:2010-06-15 01:52:57
【问题描述】:

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

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

【问题讨论】:

  • 你想在 django admin 中获取所有注册模型的数量吗?
  • 不一定。有一个我特别感兴趣。
  • 我很好奇,你最后是怎么解决你的问题的?
  • 我没有,最终没有它管理。

标签: python django django-models django-admin


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 %}
    

    这很适合这个用例。大功告成!

    【讨论】:

      【解决方案3】:

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

      简而言之,我在信号 post_delete 和 post_save 方法中计算每个模型的计数,将变量存储在自定义请求中(在地图中)并通过简单地检查每个所需的 if 将其显示在扩展的管理 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)
      

      如果您有很多模型,我建议您将其转换为更通用的解决方案。

      【讨论】:

        猜你喜欢
        • 2015-03-27
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2016-04-23
        • 2017-03-10
        • 1970-01-01
        相关资源
        最近更新 更多