Django 表单字段标签翻译

12 投票
1 回答
9673 浏览
提问于 2025-04-17 03:21

我有一个基础表单,里面有超过20个字段。然后我还有大约15个其他表单,它们是从这个基础表单继承而来的,并且传入一个叫做“fields”的参数,基础表单会用这个参数来删除其他所有字段。用例子来说明会更清楚:

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())

我的问题是,当基础表单第一次被初始化时,标签会绑定到当前语言的字段上。但是当另一个用户用不同的语言设置登录(或者当前用户切换语言)时,字段标签不会更新。

我找到了一种解决方案,使用了一个字典,像这样:

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

然后在初始化基础表单时,循环遍历所有字段并设置:

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

我有没有更好的(也就是更符合Python风格的)方法来实现这个呢?

1 个回答

15

Django 提供了一种叫做“懒惰”的翻译函数变体(比如 ugettext_lazy),这样你可以在需要访问字符串的时候再进行翻译,而不是在调用翻译函数的时候就进行翻译。

关于这个内容的详细说明可以在这里找到:https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#lazy-translation

撰写回答