Django - 管理模型中的多重复数化

12 投票
2 回答
1181 浏览
提问于 2025-04-17 19:17

我在网上搜索了很久,但没有找到结果。我是Django的新手,所以对它的所有功能还不太了解。不过这个问题对客户来说非常重要 :-( 请问你能帮我吗?

我定义了这个模型:

from django.utils.translation import ugettext_lazy as _

class Product(Model):
    #translation for model and set db table name
    class Meta:
        verbose_name = _('product')
        verbose_name_plural = _('products')
        ...

现在,由于捷克语的原因,我需要在管理列表中显示这些内容:

  • 0 výrobků
  • 1 výrobek
  • 2-4 výrobky
  • 5- výrobků

在其他地方,我成功使用了ungettext。但是,我不知道如何在Meta中获取计数。我发现这个是抽象的(但似乎没什么用):

class Model(DjangoModel):

    class Meta:
        abstract = True

    def get_description(self):
        return ungettext(self.verbose_name, self.verbose_name_plural, self.count) % \
                   {'count':self.count, 'name':self.name}

这个内容来源于 django国际化:在标记字符串以进行复数化时计数器不可用

也许最后显示语言定义会比较好(我尝试在msgid中添加/删除%s):

msgid "%s product"
msgid_plural "%s products"
msgstr[0] "%s 1 výrobek"
msgstr[1] "%s 2 výrobky"
msgstr[2] "%s 5 výrobků"

如果你需要更多信息来解答这个问题,我会提供的。

非常感谢你!

更新
请确保我在.po文件中使用了以下内容:

"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"

再说一次,除了管理模型之外,其他地方都可以正常工作。这不是如何在一般情况下运行多重复数化的问题,而是如何在管理界面(例如,新的抽象模型等)中更改任何内容以使其正常工作……

2 个回答

5

你需要在你的 .po 文件里添加:

"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"

然后,在你的模板中,你要使用复数形式,并传入一个有效的计数器。Gettext 拥有所有需要的信息:

  • 它知道有多少种复数形式
  • 它知道如何根据数字来计算复数形式
  • Django 会传递复数的消息 ID 和一个计数器
2

经过深入研究Django的源代码后,发现如果不重写很多功能,就无法在管理界面中实现这个需求。

撰写回答