我有表格类:
class Form(forms.ModelForm):
id = forms.ModelChoiceField(queryset=Option.objects.all(), widget=forms.HiddenInput())
category = forms.ModelChoiceField(queryset=Category.objects.all())
class Meta:
model = Option
fields = ('id', 'category')
def choices(self, ext_data):
# something with extdata...
choices = [('1','one')]
category = forms.ModelChoiceField(queryset=choices)
但是这个:
my_form.choices(something)
无效。为什么?
我必须在课堂上实现这个,因为我有一个视图和许多不同的形式。每种形式都有特定的选择功能。
答案 0 :(得分:4)
首先,queryset必须是查询集,而不是列表,因为您使用的是ModelChoiceField
。其次,要引用category
表单字段,请使用self.fields['category']
。因此,您的功能应如下所示:
def choices(self, ext_data):
#I'm not sure what ext_data is, but I suspect it's something to filter the Categories
self.fields['category'].queryset = Category.objects.filter(something=ext_data)
#If ext_data itself is a queryset you can use it directly:
self.fields['category'].queryset = ext_data
为了澄清,您在模型上使用Model.objects.filter(xxx)
或任何其他过滤操作时会获得一个查询集。
答案 1 :(得分:0)
尝试使用init:
class MessageAdminForm(forms.ModelForm):
def __init__(self, *arg, **kwargs):
super(MessageAdminForm, self).__init__(*args, **kwargs)
# set choices this way
self.fields['field'].choices = [(g.id, g) for g in something]