1

我有一个包含国家/城市组合的元组列表,我从中填充 django 中的选择字段。

我正在使用我的 configparser 为选择选项加载占位符settings.py

scope_value_list = dict(raw_parser.items('scope_value_list'))
CATEGORIES = SimpleNamespace(**{
  "SCOPE_CHOICES": [(code_tuple[1], _(scope_value_list[code_tuple[0]].partition('{% trans "')[2].partition('" %}')[0])) for code_tuple in raw_parser.items('scope_list')],
  ...
})

有点麻烦,但我无法在 django.po/mo 文件之外提供硬编码翻译,并且没有找到比在我的makemessages调用中包含我的 .ini 文件更好的解决方案,然后如上所示剥离翻译标志以构建我的列表选择。

然而,这意味着我的 SCOPE_CHOICES 包含惰性翻译对象而不是实际翻译,所以我有:

[('eu', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7ff11f7ad470>), ('eu-at', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7ff11f7adba8>), ('eu-be', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7ff11f7adc50>), ('eu-bg', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7ff11f7adcc0>), ('eu-hr', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7ff11f7b6278>),...]

这一切都有效(耶),但是当我在任何模板中显示选择字段时,它将按元组中的顺序排列(数组将是相同的),因此国家不会按其实际名称对 AZ 进行排序,我无法计算了解如何以与语言无关的方式进行操作。我知道延迟翻译将在“需要时”运行,所以我可以想出并且实际上可以访问选择的唯一地方是forms.py我尝试过的地方:

  scope = forms.ChoiceField(
    required=True,
    label=_("Scope"),
    choices=sorted(settings.CATEGORIES.SCOPE_CHOICES, key=lambda x: x[1]),
    help_text=_("User participation scope.")
  )

因为从那里开始它显示在模板中:

<div class="form-group">
  {{ form.scope.label_tag }}
  <div class="">
    {{ form.scope.errors }}
    {{ form.scope }}
  </div>
</div>

可悲的是,它不起作用,并且这些项目仍按原始顺序排列,这意味着我显示它们的任何语言都没有按字母顺序排序。

因此,问题是
如何以及在哪里对 Django 惰性翻译对象数组进行排序?

4

0 回答 0