如何从迁移中排除verbose_name_plural字段



下午好!我使用verbose_name_plural动态字段在管理面板中显示一些最新信息。Django版本:4.1模型如下:

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)'},
),
]

我找到了这个选项: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,那么不幸的是,管理面板页面加载时会出现错误,但我没有发现任何问题。

相关内容

最新更新