2011-09-29 12 views
10

Tengo una base con más de 20 campos. Luego tengo alrededor de otras 15 formas que heredan de ese formulario, pasando un parámetro llamado fields que usa la baseform para eliminar todos los demás campos. Mejor explicar a través de ejemplo:Django form field label translations

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) 

La forma resultante sería el siguiente aspecto:

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

Mi problema es que cuando el BaseForm se inicializa por primera vez, las etiquetas están destinadas a los campos con el idioma activo, y cuando otro usuario inicia sesión con otra configuración de idioma (o el usuario actual cambia de idioma) las etiquetas de campo no se actualizan.

he llegado a una solución utilizando un diccionario de esta manera:

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

y luego, cuando la inicialización del bucle a través de la representación base todos los campos y establecer

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

Me gustaría saber más agradable (leer : más pitonica) forma de lograr esto?

+3

¿Utiliza ugettext_lazy para la traducción de los campos? –

+1

@Krzysztof: ¡Por supuesto! Eso fue bastante estúpido, estaba importando ugettext en lugar de ugettext_lazy ... Si publicas tu comentario como respuesta, lo aceptaré;) –

Respuesta