Django表单:如何动态创建ModelChoiceField标签

我想为form.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)

默认标签由Profile定义中指定的unicode函数定义。但是,需要动态创建由ModelChoiceField创建的单选按钮的标签。

首先,我认为我可以按照Django文档中的描述简单地覆盖ModelChoiceField。但这会创建静态标签。它允许你定义任何标签,但是一旦做出选择,该选择就是固定的。

所以我认为我需要适应添加一些东西到init:

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>??? = ???

任何人有任何想法如何处理?任何帮助将不胜感激。

我找到了一些东西,但我不知道这是否是最佳解决方案。我将一些内容添加到类ProfileForm 的init部分中,如下所示:

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)

回答:

你可以使用a ModelChoiceField然后ProfileForm.__init__动态更改你的选择,例如(假设它已经是ModelChoiceField):

horoscopes = Horoscope.objects.all()

self.fields['horoscope'].choices = [(h.pk, h.name) for h in horoscopes]

h.name 在本例中将用作选择的标签!

以上是 Django表单:如何动态创建ModelChoiceField标签 的全部内容, 来源链接: utcz.com/qa/429780.html

回到顶部