Django - 在管理模型中进行多重复数处理

12

我已经在谷歌上搜索很长时间了,但并没有找到结果。我是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个产品
  • 1个产品
  • 2-4个产品
  • 5个及以上产品

在其他地方,我已经成功使用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传递了复数形式的msg_id和计数器

嘿,我在其他地方都成功使用了这个,只有在管理模型中它不起作用。我更新了帖子以确保每个人都能看到我在.po文件中有这个文本。 - tomis

2

在深入研究Django源代码之后,如果不覆盖许多函数,就无法在管理用例中实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接