2011-09-29 28 views
10

20'den fazla alana sahip bir temel formum var. Daha sonra, bu formdan miras kalan yaklaşık 15 tane başka formum var; bu, taban formunun diğer tüm alanları silmek için kullandığı alanlar olarak adlandırılan bir parametreden geçiyor. En Örneğin yoluyla açıklamak:Django form alanı etiket çevirisi

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) 

çıkan formu daha sonra şu şekilde görünecektir:

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

Benim sorunum BaseForm ilk kez başlatıldığında, etiketler ile alanlara bağlı olmasıdır aktif dil ve başka bir kullanıcı başka bir dilde oturum açtığında (veya geçerli kullanıcı dilleri değiştirdiğinde) alan etiketleri güncellenmez.

Böyle bir dict kullanarak bir solüsyon geldiniz: tüm alanları arasında döngü baseform başlatılıyor ve

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

Ben her güzel var mı ayarlarken sonra

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

ve (okuma : daha pythonic) bunu başarma yolu?

+3

Eğer alanları tercüme için ugettext_lazy kullanıyor musunuz kısmında ayrıntılı olarak belgelenmiştir ki? –

+1

@Krzysztof: Tabii ki! Bu oldukça aptalca, ugettext_lazy yerine ugettext ithal ediyordum ... Eğer yorumunuzu cevap olarak gönderirseniz kabul edeceğim;) –

cevap