2011-09-29 11 views
10

Posiadam format podstawowy z ponad 20 polami. Następnie mam około 15 innych formularzy dziedziczących z tego formularza, przekazując parametr o nazwie pola, którego używa się do usunięcia wszystkich pozostałych pól. Najlepiej wyjaśnić poprzez przykład:Formularze w formacie pola Django

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) 

Powstała forma będzie wtedy wyglądać tak:

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

Moim problemem jest to, że gdy BaseForm jest inicjowany po raz pierwszy, etykiety są zobowiązane do pól z język aktywny, a gdy inny użytkownik loguje się z innym językiem (lub aktualny użytkownik zmienia języki), etykiety pól nie są aktualizowane.

Doszedłem do rozwiązania przy użyciu dict takiego:

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

a kiedy inicjowania baseform zapętlenie poprzez wszystkie pola i ustawienie

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

Czy muszę każdy ładniejszy (czytaj : bardziej pythonic) sposób osiągnięcia tego?

+3

Używasz ugettext_lazy do tłumaczenia pól? –

+1

@Krzysztof: Oczywiście! To było dość głupie, importowałem ugettext zamiast ugettext_lazy ... Jeśli napiszesz swój komentarz jako odpowiedź, zaakceptuję to;) –

Odpowiedz

Powiązane problemy