如何从类中修改表单选择?

时间:2011-08-23 10:02:10

标签: django django-forms

我有表格类:

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)

无效。为什么?

我必须在课堂上实现这个,因为我有一个视图和许多不同的形式。每种形式都有特定的选择功能。

2 个答案:

答案 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]