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

Posted

技术标签:

【中文标题】Django:使用小部件来限制 ModelForm 中的选择【英文标题】:Django : Use widget to limit choices in a ModelForm 【发布时间】:2012-07-11 03:37:44 【问题描述】:

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

我必须使用 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)
        

【问题讨论】:

什么是a1a2a3 【参考方案1】:

来自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  

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

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

【讨论】:

如果 OP 使用 forms.ChoiceField,则选择应该是查询集。选择需要是键/值对元组的元组。只有当 OP 使用 forms.ModelChoiceField 时,他们才应该使用查询集。 @ChrisPratt,感谢您的评论。我的意思是,在第二种情况下,name 是一个 modelChoiceField,choices 应该是一个查询集。你同意?请随意修正我的答案。【参考方案2】:

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

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

【讨论】:

以上是关于Django:使用小部件来限制 ModelForm 中的选择的主要内容,如果未能解决你的问题,请参考以下文章

Django 2.0 ModelForm dateField 不显示为小部件

Django SelectMultiple 小部件的动态选择

Django ForeignKey 表单字段小部件

Django:Timefield小部件没有显示在模板中

Django:使用原始查询来限制 ModelForm 中的外键选择字段

依赖于模型的 Django 小部件