首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将verbose_name_plural字段排除在迁移之外?

如何将verbose_name_plural字段排除在迁移之外?
EN

Stack Overflow用户
提问于 2022-09-27 09:02:08
回答 1查看 35关注 0票数 1

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

代码语言:javascript
复制
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)()

我不记得我在哪里找到了这个选项来显示一些信息,但它非常有用,只是每次运行值更改和创建迁移的命令时,我都会得到如下内容:

代码语言:javascript
复制
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,但我不知道它有多重要,以及为什么没有使用的类被导入到那里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-28 09:38:32

基于0sVoid建议的变体,我实现了一个稍微不同的版本,它似乎没有问题。

最初,建议更改管理面板(_build_app_dict)的主类中的一种方法:https://stackoverflow.com/a/71740645/2166371

但是这个方法中有太多的代码我不想重写

我重写了另一个方法get_app_list

家长法:

代码语言:javascript
复制
    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

我的版本:

代码语言:javascript
复制
    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方法是为模型描述的,那么我们将其名称更改为该方法返回的名称。

在模型本身中,我添加了以下行:

代码语言:javascript
复制
    @classmethod
    def get_name_admin_panel(cls):
        return _('Posts ({})').format(Post.objects.filter(...).count())

由于这一点,我现在可以为verbose_name_plural字段设置一个静态值,并且迁移不会重复多次。

如果您没有指定一个@classmethod,那么不幸的是,管理面板页面将加载一个错误,但我没有发现任何问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73864933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档