Как исключить поле verbose_name_plural из миграции?
<from django.utils.functional import lazy
from django.utils.translation import gettext_lazy as _
class Post(models.Model):
# ...
class Meta:
verbose_name = 'Post'
verbose_name_plural = lazy(lambda: _('Posts ({})').format(Post.....count()), str)()
<
from django.db import migrations
class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='post',
options={'verbose_name': 'Post', 'verbose_name_plural': 'Posts (123)'},
),
]
Добрый день! Я использую динамическое поле verbose_name_plural для отображения некоторой актуальной информации в админ панели.
Версия Django: 4.1
Модель выглядит следующим образом:
Я нашел этот вариант: https://stackoverflow.com/a/39801321/2166371 Но я не знаю, насколько это актуально и почему класс, который не используется, импортируется там
Основываясь на варианте, который предложил 0sVoid, я реализовал немного другой вариант, который, похоже, работает без проблем.
Изначально было предложено изменить один метод в главном классе панели администратора (_build_app_dict
): https://stackoverflow.com/a/71740645/2166371
Но в этом методе слишком много кода, который я не хотел переписывать
Я переписал другой метод get_app_list
Родительский метод:
def get_app_list(self, request, app_label=None):
"""
Return a sorted list of all the installed apps that have been
registered in this site.
"""
app_dict = self._build_app_dict(request, app_label)
# Sort the apps alphabetically.
app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower())
# Sort the models alphabetically within each app.
for app in app_list:
app["models"].sort(key=lambda x: x["name"])
return app_list
Моя версия:
def get_app_list(self, request, app_label=None):
"""
Return a sorted list of all the installed apps that have been
registered in this site.
"""
app_dict = self._build_app_dict(request, app_label)
# Sort the apps alphabetically.
app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower())
# Sort the models alphabetically within each app.
for app in app_list:
app["models"].sort(key=lambda x: x["name"])
for model in app['models']:
if hasattr(model['model'], 'get_name_admin_panel'):
model['name'] = model['model'].get_name_admin_panel()
return app_list
Я добавил 3 новые строки, перед возвратом (эти строки также могут быть добавлены перед сортировкой, если последовательность важна для вас)
Есть проверка, что если для модели описан метод get_name_admin_panel
, то мы меняем ее имя на то, которое возвращает метод
В самой модели я добавил следующие строки:
@classmethod
def get_name_admin_panel(cls):
return _('Posts ({})').format(Post.objects.filter(...).count())
Благодаря этому я теперь могу установить статическое значение для поля verbose_name_plural
и миграция не будет повторяться много раз
Если вы не укажете @classmethod
, то, к сожалению, страница панели администратора загрузится с ошибкой, но я не заметил в этом никакой проблемы.