Подтвердить что ты не робот

Переводы ярлыков полей Django

У меня есть baseform с более чем 20 полями. Затем у меня есть около 15 других форм, наследующих от этой формы, передавая параметр, называемый полями, которые 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 инициализируется в первый раз, метки привязаны к полям с активным языком, а когда другой пользователь входит в систему с другим языковым параметром (или текущие пользователи меняют языки), метки полей не обновляйте.

Я пришел к решению с помощью dict так:

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

а затем при инициализации базовой формы, проходящей через все поля, и установки

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

Есть ли у меня какой-нибудь приятный способ (читайте: больше pythonic) для достижения этого?

4b9b3361

Ответ 1

Django предоставляет _lazy варианты функций трансляции (например, ugettext_lazy), поэтому вы можете создавать строки для переводов во время доступа (в отличие от того, когда вызывается функция перевода).

Он подробно описан в https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#lazy-translation