Evgenii Legotckoi
Evgenii LegotckoiMay 4, 2020, 2:21 p.m.

Django - Tutorial 053. Adding Counters to Models in the Django Admin Panel

The other day, I started working on a content moderation application on the site and solved the problem of adding counters in the administrative panel.

It looks like this now

The task itself is trivial, but as it turned out there is a nuance, without knowing which, this task will not work right away.


Introduction

In order to set custom text for models in the administrative panel, we usually redefine the variable verbose_name_plural in the meta object of the model. The most common option is to add multilingual support. For example,

from django.utils.translation import ugettext_lazy as _

class Article(models.Model):

    class Meta:
        verbose_name = _('Article')
        verbose_name_plural = _('Articles')

It always works and we don’t think about why it works. And this works because ugettext_lazy is a lazy function that returns the result exactly when it is needed.

In the same way, you can return the number of objects or a specific number of objects and add them to this text in administrative ponel using lazy functions.

Example

In this way, for the moderation proxy model, I have drawn the number of unmoderated objects.

# -*- 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()

Example description

Let's analyze the whole class. This is a special proxy model that

  • Allows you to display a model of articles in the moderation application
  • Which has a special object manager that will only return unmoderated objects

In fact, you are not interested in the object manager; it can release any logic that you plan to add to your application.
It is also not necessary that the model is a proxy model. All this you can do at your discretion.

But the most interesting line for you will be next

verbose_name_plural = lazy(lambda: _('Articles ({})').format(ModeratedArticle.objects.to_moderation().count()), str)()
  • Firstly, a lazy object is used here,
  • to which the function is transferred, it can be either a regular function or a lambda function. In my case, lambda.
  • a rotatable final data type is also passed str as the second argument lazy
  • and the function itself is executed to get the final instance, this is done using the parentheses operator at the end of the line ()

As a result, it will be possible to add a counter of objects of interest to the administrative panel.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

Misha Lebedev
  • May 4, 2020, 4:24 p.m.

Good

Comments

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

C++ - Test 002. Constants

  • Result:41points,
  • Rating points-8
E

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
E

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
Last comments
Evgenii Legotckoi
Evgenii LegotckoiDec. 3, 2023, 7:39 p.m.
Django - Lesson 059. Saving the selected language in user settings It is redirect from untranslated url to translated url. It is normal behavior for mutlilanguage web site based on the Django.
c
coder55Dec. 2, 2023, 4:34 a.m.
Django - Lesson 059. Saving the selected language in user settings It tries to do language translation in API views. That's why it sends or receives the same API request twice. Do you have any suggestions on this? Example: stripe webhook. "GET /warehouse/…
g
gr1047Nov. 12, 2023, 9:35 p.m.
Qt/C++ - Lesson 035. Downloading files via HTTP with QNetworkAccessManager Добрый день. Изучаю Qt на ваших уроках. Всё нормально работает на Linux. А под Win один раз запустилось, а сейчас вместо данных сайта получается ошибк "Unable to write". Куда копать, ума не…
D
DamirNov. 2, 2023, 1:41 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers С CMake всё на много проще: find_package(Boost)
Павел Дорофеев
Павел ДорофеевOct. 29, 2023, 12:48 a.m.
Как написать свой QTableView Итак начинаем писать свои виджеты на основе QAbstractItemView. А что так можно было?
Now discuss on the forum
BlinCT
BlinCTNov. 30, 2023, 8:18 p.m.
Сборка проекта Qt6 из под винды на удаленой машине Всем привет. Сталкнулся с такой странностью: надо собирать проект из под 10 винды на удаленой линуксовой машине, проект строится на QT6, но вот когда cmake генерит свой кеш то вылитает…
Evgenii Legotckoi
Evgenii LegotckoiNov. 19, 2023, 7:14 p.m.
CKEditor 5 и подсветка синтаксиса. Добрый день. Я устал разбираться с CKEditor и просто перешёл на использование самописного markdown редактора...
Виктор Калесников
Виктор КалесниковOct. 20, 2023, 2:29 p.m.
Контакты Android делал в далеком 2017г поэтому особенно ничего не подскажу. Это основные методы получения данных с андроида используя Qt. Там еще какоето колдунство с манифестом. Андроидом давно не занимаюс…
m
mihamuzOct. 19, 2023, 12:03 a.m.
Скачать Qt 6 Сработал следующий алгоритм. Инстолятор скачал используя это https://freevpnplanet.com/ru/ как расширение браузера. Потом установил это https://freevpnplanet.com/ru/ же на ПК и через инстолятор …

Follow us in social networks