Есть ли аккуратный способ сделать число записей/объектов для модели отображаться в главном списке моделей в модуле администратора 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)
Если у вас много моделей, я предлагаю вам преобразовать это в более общее решение.