我有一个包含国家/城市组合的元组列表,我从中填充 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 惰性翻译对象数组进行排序?