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?
Używasz ugettext_lazy do tłumaczenia pól? –
@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;) –