Evgenii Legotckoi
Evgenii Legotckoi04 травня 2020 р. 14:21

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

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

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

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


Вступ

Для того, щоб задати кастомний текст для моделей в адміністративній панелі, ми зазвичай переобумовленої змінну 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 є ледачою функцією, яка повертає результат рівно тоді, коли він потрібен.

Таким же чином можна повертати кількість об'єктів або специфічне кількість об'єктів і додавати їх до цього тексту в адміністратвной понели, використовуючи 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)()
  • По-перше, тут використовується lazy об'єкт,
  • В який передається функція, це може бути як звичайна функція, так і lambda функція. У моєму випадку lambda.
  • Також передається вовращаемий підсумковий тип даних str в якості другого аргументу lazy
  • І ще виконується сама функція для отримання підсумкового інстанси, це робиться за допомогою оператора круглих дужок в кінці рядка ()

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

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

Misha Lebedev
  • 04 травня 2020 р. 16:24

Good

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Г

C++ - Тест 001. Первая программа и типы данных

  • Результат:66бали,
  • Рейтинг балів-1
t

C++ - Тест 001. Первая программа и типы данных

  • Результат:33бали,
  • Рейтинг балів-10
t

Qt - Тест 001. Сигналы и слоты

  • Результат:52бали,
  • Рейтинг балів-4
Останні коментарі
G
GoattRock03 вересня 2024 р. 10:50
Як скопіювати файли в Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
Влад Русоков01 серпня 2024 р. 22:47
Як скопіювати файли в Linux Screenshot_20240802-065123.png
d
dblas505 липня 2024 р. 08:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr08 лютого 2024 р. 15:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко04 лютого 2024 р. 22:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 12:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
Fynjy22 липня 2024 р. 01:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCT24 червня 2024 р. 22:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCT05 травня 2024 р. 02:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 11:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Слідкуйте за нами в соціальних мережах