Sin*_*son 12 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)
Run Code Online (Sandbox Code Playgroud)
结果表格看起来像这样:
class SubForm(forms.Form):
reportid = forms.HiddenInput()
todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
Run Code Online (Sandbox Code Playgroud)
我的问题是,当BaseForm第一次初始化时,标签被绑定到具有活动语言的字段,当另一个用户使用另一种语言设置(或当前用户更改语言)登录时,字段标签不会更新.
我使用像这样的字典来解决方案:
labels = {
'todate': lambda: _("To"),
'fromdate': lambda: _("From"),
.....
}
Run Code Online (Sandbox Code Playgroud)
然后在初始化基础形式循环遍历所有字段和设置时
self.fields[field].widget.label = labels[field]()
Run Code Online (Sandbox Code Playgroud)
我有更好的(阅读:更pythonic)方式实现这一目标吗?
小智 14
Django提供了翻译函数的_lazy变体(例如ugettext_lazy
),因此您可以在访问时(而不是在调用翻译函数时)使用字符串进行翻译.
详情请见https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#lazy-translation