Как отобразить общее количество записей по моделям в django admin - PullRequest
11 голосов
/ 15 июня 2010

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

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

Ответы [ 3 ]

3 голосов
/ 08 ноября 2012
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» из «contrib / admin / templates / index.html» django.

Вверху добавьте:

{% load NAME_OF_YOUR_TAG_FILE %}

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

{% get_model_count model.admin_url %}

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

3 голосов
/ 23 июня 2010

Я бы посмотрел в модели. Менеджер класса. Подкласс Manager позволит вам добавить функциональность на уровне таблиц к вашим моделям. Метод Manager может возвращать любые данные, которые вам нужны, и в документации Django DB API есть интересный пример. После этого вы сможете перенести это в Admin, добавив в вашу модель внутренний класс admin.

1 голос
/ 01 декабря 2011

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

Короче, я вычисляю количество каждой модели в сигналах 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)

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

...