- 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