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)
【问题讨论】:
什么是a1
、a2
和a3
?
【参考方案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 小部件的动态选择