Django:使用小部件来限制ModelForm中的选择

时间:2012-07-11 13:43:33

标签: django forms widget

我的模型表单继承自子系统表单。 我想限制表单中用户的选择。 (特别是这个名字) 我知道我必须使用小部件。但它不起作用。

我必须使用SubsytemForm。

SUBSYSTEM_CHOICES = (a1,a2,a3)
Class Subsystem(models.Model):
name = models.CharField("Name", max_length=20)


class SubsytemForm(forms.ModelForm):   
class Meta:
    model = Subsystem
    widgets = {
        'name': ChoiceField(widget=RadioSelect, choices=SUBSYSTEM_CHOICES)
    }

2 个答案:

答案 0 :(得分:5)

来自django model forms documentation

  

如果你明确地实例化这样的表单字段,Django假设   你想要完全定义它的行为;因此,默认   属性(例如max_length或required)不是从中提取的   相应的模型。如果要保持指定的行为   在模型中,您必须明确设置相关参数   声明表单字段。

您可以尝试:

class SubsytemForm(forms.ModelForm):  
    name =  forms.ChoiceField(widget=RadioSelect, choices= choices )
    class Meta:
        model = Subsystem

你也可以

class SubsytemForm(forms.ModelForm):  
    class Meta:
        model = Subsystem
    def __init__(self, *args, **kwargs):
        self.name_choices = kwargs.pop('name_choices', None)
        super(SubsytemForm,self).__init__(*args,**kwargs)
        self.fields['name'].queryset= self.name_choices  

并在name_choices创建中将SubsytemForm作为参数发送。请记住,选择应该是一个查询集。

另外,您应该阅读How do I filter ForeignKey choices in a Django ModelForm?

答案 1 :(得分:3)

SUBSYSTEM_CHOICES不是choices属性的有效值,因为它没有键/值对。你需要这样的东西:

SUBSYSTEM_CHOICES = (
    (a1, 'a1 Display'),
    (a2, 'a2 Display'),
    (a3, 'a3 Display'),
)