Evgenii Legotckoi
05 травня 2020 р. 00:21

Django - Урок 053. Додавання лічильників до моделей в адміністративній панелі Django

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

Виглядає це зараз так

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


Вступ

Для того, щоб задати кастомний текст для моделей в адміністративній панелі, ми зазвичай переобумовленої змінну verbose_name_plural в мета об'єкті моделі. Найпоширенішим варіантом є додавання підтримки багатомовності. Наприклад так,

  1. from django.utils.translation import ugettext_lazy as _
  2.  
  3. class Article(models.Model):
  4.  
  5. class Meta:
  6. verbose_name = _('Article')
  7. verbose_name_plural = _('Articles')
  8.  

Це завжди працює і ми не замислюємося, чому це працює. А працює це завдяки тому, що ugettext_lazy є ледачою функцією, яка повертає результат рівно тоді, коли він потрібен.

Таким же чином можна повертати кількість об'єктів або специфічне кількість об'єктів і додавати їх до цього тексту в адміністратвной понели, використовуючи lazy функції.

Приклад

Таким ось чином у мене для проксі моделі модерації зроблено висновок кількості немодерірованних об'єктів.

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.utils.functional import lazy
  4. from django.utils.translation import ugettext_lazy as _
  5.  
  6. from knowledge.models import Article
  7. from moderation.managers import ArticleModeratedQuerySet
  8.  
  9.  
  10. class ModeratedArticle(Article):
  11.  
  12. class Meta:
  13. proxy = True
  14. verbose_name = _('Article')
  15. verbose_name_plural = lazy(lambda: _('Articles ({})').format(ModeratedArticle.objects.to_moderation().count()), str)()
  16.  
  17. objects = ArticleModeratedQuerySet.as_manager()

Опис прикладу

Розберемо весь клас. Це спеціальна проксі модель, яка

  • Дозволяє відобразити модель статей в додатку модерації
  • Яка має спеціальний менеджер об'єктів, який буде повертати тільки немодерірованние об'єкти

По суті вас не цікавить менеджер об'єктів, він може релізовивать будь-яку логіку, яку ви плануєте додати в вашу програму.
Також не обов'язково, щоб модель була проксі моделлю. Все це ви можете зробити на свій розсуд.

А ось найцікавіша для вас строчка буде наступною

  1. verbose_name_plural = lazy(lambda: _('Articles ({})').format(ModeratedArticle.objects.to_moderation().count()), str)()
  • По-перше, тут використовується lazy об'єкт,
  • В який передається функція, це може бути як звичайна функція, так і lambda функція. У моєму випадку lambda.
  • Також передається вовращаемий підсумковий тип даних str в якості другого аргументу lazy
  • І ще виконується сама функція для отримання підсумкового інстанси, це робиться за допомогою оператора круглих дужок в кінці рядка ()

В результаті, можна буде додати лічильник цікавлять об'єктів в адміністративну панель.

Вам це подобається? Поділіться в соціальних мережах!

Misha Lebedev
  • 05 травня 2020 р. 02:24

Good

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…