如何以及在何处对Django <django.utils.functional.lazy>对象数组进行排序?

时间:2018-07-14 21:04:52

标签: python django sorting internationalization lazy-evaluation

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

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

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文件之外提供硬编码的翻译,并且没有找到比将我的.ini文件包括在我的makemessages调用中然后去除翻译标志更好的解决方案如上所示建立我的选择列表。

但这意味着我的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 lazy-translation-objects数组进行排序?

0 个答案:

没有答案