Chciałbym utworzyć etykiety dynamiczne dla formularzy. ModeloChoiceField i zastanawiam się, jak to zrobić. Mam następujące klasy formularza:Formy Django: jak dynamicznie tworzyć etykiety ModelChoiceField
class ProfileForm(forms.ModelForm):
def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
super(ProfileForm, self).__init__(data, *args, **kwargs)
self.fields['family_name'].label = family_name_label
.
.
self.fields['horoscope'].label = horoscope_label
self.fields['horoscope'].queryset = Horoscope.objects.all()
class Meta:
model = Profile
family_name = forms.CharField(widget=forms.TextInput(attrs={'size':'80', 'class': 'contact_form'}))
.
.
horoscope = forms.ModelChoiceField(queryset = Horoscope.objects.none(), widget=forms.RadioSelect(), empty_label=None)
domyślne etykiety są zdefiniowane przez unicode funkcji określonej w definicji profilu. Etykiety przycisków radiowych tworzonych przez ModelChoiceField muszą być jednak tworzone dynamicznie.
Najpierw pomyślałem, że mogę po prostu przesłonić ModelChoiceField, jak opisano w dokumentacji Django. Ale to tworzy statyczne etykiety. Pozwala zdefiniować dowolną etykietę, ale po dokonaniu wyboru ten wybór jest stały.
Więc myślę, że trzeba dostosować dodać coś do Init jak:
class ProfileForm(forms.ModelForm):
def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
super(ProfileForm, self).__init__(data, *args, **kwargs)
self.fields['family_name'].label = family_name_label
.
.
self.fields['horoscope'].label = horoscope_label
self.fields['horoscope'].queryset = Horoscope.objects.all()
self.fields['horoscope'].<WHAT>??? = ???
Każdy mający żadnego pojęcia, jak radzić sobie z tym? Każda pomoc byłaby bardzo doceniana.
Znalazłem coś, ale nie wiem, czy to najlepsze rozwiązanie. Dodam coś do Init części klasy ProfileForm następująco:
class ProfileForm((forms.ModelForm):
def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
super(ProfileForm, self).__init__(data, *args, **kwargs)
# this function is added
def get_label(self, language_code):
"""
returns the label in the designated language, from a related object (table)
"""
return HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language
self.fields['family_name'].label = family_name_label
.
.
self.fields['horoscope'].queryset = Horoscope.objects.all()
self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language, obj.price)
.
.
"""
The next code also works, the lambda function without the get_label function
"""
self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (obj.horoscope_type, obj.price)
.
.
"""
But this code doesn't work. Anyone?
"""
self.fields['horoscope'].label_from_instance = get_label(obj, language_code)
Czy miałeś na myśli "domyślne etykiety są zdefiniowane w funkcji' unicode' określonej w definicji _Horoscope_ " ? –