- 1. Вступление
- 2. Пример
- 3. Пример описания
На днях начал работать над приложением для модерации контента на сайте и решил проблему с добавлением счетчиков в административной панели.
Это выглядит так сейчас
Сама задача тривиальна, но как оказалось есть нюанс, не зная которого сразу эта задача не получится.
Вступление
Чтобы установить пользовательский текст для моделей в административной панели, мы обычно переопределяем переменную verbose_name_plural в метаобъекте модели. Самый распространенный вариант — добавить многоязычную поддержку. Например,
from django.utils.translation import ugettext_lazy as _ class Article(models.Model): class Meta: verbose_name = _('Article') verbose_name_plural = _('Articles')
Это всегда работает, и мы не задумываемся, почему это работает. И это работает, потому что ugettext_lazy — ленивая функция, которая возвращает результат именно тогда, когда это необходимо.
Таким же образом можно вернуть количество объектов или конкретное количество объектов и добавить их в этот текст в административной понели с помощью ленивых функций.
Пример
Таким образом, для прокси-модели модерации я нарисовал количество немодерируемых объектов.
# -*- coding: utf-8 -*- from django.utils.functional import lazy from django.utils.translation import ugettext_lazy as _ from knowledge.models import Article from moderation.managers import ArticleModeratedQuerySet class ModeratedArticle(Article): class Meta: proxy = True verbose_name = _('Article') verbose_name_plural = lazy(lambda: _('Articles ({})').format(ModeratedArticle.objects.to_moderation().count()), str)() objects = ArticleModeratedQuerySet.as_manager()
Пример описания
Давайте проанализируем весь класс. Это специальная прокси-модель, которая
- Позволяет отображать модель статей в приложении для модерации
- У которого есть специальный менеджер объектов, который будет возвращать только немодерируемые объекты
На самом деле вас не интересует диспетчер объектов; он может освободить любую логику, которую вы планируете добавить в свое приложение.
Также не обязательно, чтобы модель была прокси-моделью. Все это вы можете сделать на свое усмотрение.
Но самая интересная линия для вас будет следующей
verbose_name_plural = lazy(lambda: _('Articles ({})').format(ModeratedArticle.objects.to_moderation().count()), str)()
- Во-первых, здесь используется ленивый объект,
- которому передается функция, это может быть как обычная функция, так и лямбда-функция. В моем случае лямбда.
- вращающийся окончательный тип данных также передается str в качестве второго аргумента lazy
- а сама функция выполняется для получения конечного экземпляра, это делается с помощью оператора скобок в конце строки ()
В результате появится возможность добавить в административную панель счетчик интересующих объектов.
Good