【问题标题】:Django form field label translationsDjango 表单字段标签翻译
【发布时间】:2011-11-27 14:23:49
【问题描述】:

我有一个包含 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"),
    .....
}

然后在初始化baseform时遍历所有字段并设置

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

我有更好的(阅读:更 Python 的)方法来实现这一点吗?

【问题讨论】:

  • 你使用 ugettext_lazy 翻译字段吗?
  • @Krzysztof:当然!那很愚蠢,我正在导入 ugettext 而不是 ugettext_lazy ...如果您将评论作为答案发表,我会接受它;)

标签: python django internationalization django-forms


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多