Django表单字段标签翻译

时间:2011-09-29 10:29:32

标签: python django internationalization django-forms

我有一个超过20个字段的基础形式。然后我有大约15个从该表单继承的其他表单,传入一个名为fields的参数,baseform用它来删除所有其他字段。最佳解释通过示例:

class BaseForm(forms.Form):
    reportid = forms.HiddenInput()
    fromdate = forms.DateField(label=_("From"), widget=widgets.AdminDateWidget())
    todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
    sort_by = forms.ChoiceField(label=_("Sort by"), choices=[])
    .......

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields')
        #Pseudo:
        ***del self.fields[field] for field not in fields***

class SubForm(forms.Form):
    def __init__(self, *args, **kwargs):
        fields = ['reportid', 'todate']
        super(SubForm, self).__init__(fields=fields, *args, **kwargs)

结果表格如下所示:

class SubForm(forms.Form):
    reportid = forms.HiddenInput()
    todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())

我的问题是,当BaseForm第一次初始化时,标签被绑定到具有活动语言的字段,当另一个用户使用另一种语言设置(或当前用户更改语言)登录时,字段标签不要更新。

我使用这样的字典来解决问题:

labels = {
    'todate': lambda: _("To"),
    'fromdate': lambda: _("From"),
    .....
}

然后初始化基础形式循环遍历所有字段并设置

self.fields[field].widget.label = labels[field]()

我有更好的(阅读:更多pythonic)方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:12)

Django提供了翻译函数的_lazy变体(例如ugettext_lazy),因此您可以在访问时(而不是在调用翻译函数时)对字符串进行翻译。

详细记录在https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#lazy-translation