Как отобразить общее количество записей в моделях в django admin

Есть ли аккуратный способ сделать число записей/объектов для модели отображаться в главном списке моделей в модуле администратора django?

Я нашел методы для показа количества связанных объектов внутри наборов на странице list_display (и я могу видеть общее количество в разделе разбиения на страницы в нижней части того же самого), но не нашел четкого способа показать количество записей на уровне списка моделей.

Ответ 1

Я бы посмотрел класс models.Manager. Подкласс менеджера позволит вам добавить функциональность на уровне таблиц к вашим моделям. Метод Manager может возвращать любые данные, которые вы хотите, и есть интересный пример в документации API Django DB. Затем вы сможете перенести это в 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()

Затем скопируйте и переопределите "/templates/admin/index.html" из "django contrib/admin/templates/index.html".

В верхней части добавить:

{% load NAME_OF_YOUR_TAG_FILE %}

Добавьте следующий вызов после имени модели или где угодно:

{% get_model_count model.admin_url %}

Это хорошо подходит для этого варианта использования. Все готово!

Ответ 3

Я не нашел приятного способа добавить количество моделей на главной странице администратора, но вот решение, которое я наконец использую.

Короче, я вычисляю подсчеты каждой модели в методах post_delete и post_save сигналов, сохраняю переменные в пользовательском запросе (на карте) и отображаю их в расширенном admin index.html, просто проверяя с помощью if для каждого желаемого модели.

Расширенные шаблоны /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)

Если у вас много моделей, я предлагаю вам преобразовать это в более общее решение.