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

admin, Django, python

Content

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.
- company blog
Support the author Donate

Good

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
June 5, 2020, 11:20 p.m.
Aleksej

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.
Aleksej

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

  • Result:53points,
  • Rating points-4
V
June 5, 2020, 4:47 p.m.
Vladzo

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
s
June 6, 2020, 1:54 a.m.
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
June 6, 2020, 12:45 a.m.
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.
Aleksej

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB