Tôi muốn tạo các nhãn động cho một biểu mẫu.ModelChoiceField và tôi tự hỏi làm thế nào để làm điều đó. Tôi có lớp mẫu dưới đây:Các hình thức Django: cách tạo động các nhãn 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)
Các nhãn mặc định được xác định bởi các unicode chức năng quy định trong định nghĩa hồ sơ. Tuy nhiên, nhãn cho các nút radio được tạo bởi ModelChoiceField cần phải được tạo động.
Đầu tiên tôi nghĩ rằng tôi có thể chỉ đơn giản là ghi đè ModelChoiceField như được mô tả trong tài liệu Django. Nhưng điều đó tạo ra các nhãn tĩnh. Nó cho phép bạn xác định bất kỳ nhãn nào nhưng khi lựa chọn được thực hiện, lựa chọn đó đã được sửa.
Vì vậy, tôi nghĩ rằng tôi cần phải thích ứng thêm cái gì đó để init như:
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>??? = ???
Bất cứ ai có bất kỳ ý tưởng làm thế nào để xử lý này? Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.
Tôi đã tìm thấy điều gì đó nhưng tôi không biết đó có phải là giải pháp tốt nhất hay không. Tôi thêm vài thứ vào init phần của lớp ProfileForm như sau:
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)
Ý của bạn là "các nhãn mặc định được định nghĩa trong hàm' unicode' được chỉ định trong định nghĩa _Horoscope_ " ? –