Django 根据模型实例限制 ModelForm 中 ManyToMany 字段的选项
Django restrict options of ManyToMany field in ModelForm based on model instance
我只想显示已存储在模型 ManyToManyField
中的选项。
我有模型 Order
,我想要一个基于模型的表单,如下所示:
class OrderForm(ModelForm):
class Meta:
model = Order
fields = ['amount', 'color']
现在我不想显示所有颜色作为选择,而是只显示保存在另一个模型的 ManyToManyField
中的颜色实例。另一个模型是设计:
class Design(models.Model):
color = models.ManyToManyField('maker.Color')
# ...
这在使用 ModelForm
时完全可行吗?
尝试
我已经尝试通过 ModelForm 的设计和设置实例来做到这一点:
class ColorForm(ModelForm):
class Meta:
model = Design
fields = ['color']
然后在视图中:
color_form = ColorForm(instance=design)
但我不太明白设置实例的作用,我认为实例不是我要找的,因为它仍然列出了所有颜色。
instance
设置与限制选择无关。本质上,它只是用特定记录中的值填充表单的值。您通常在编辑操作中提供实例,而在添加操作中跳过它。
models.ManyToManyField
在 ModelForm
中的表示是 forms.ChoiceField
,您可以简单地覆盖它的 queryset
属性,并指定查询集你想要的。
因此,在您看来:
form = OrderForm()
form.fields['color'].queryset = Design.object.all() # for example
我只想显示已存储在模型 ManyToManyField
中的选项。
我有模型 Order
,我想要一个基于模型的表单,如下所示:
class OrderForm(ModelForm):
class Meta:
model = Order
fields = ['amount', 'color']
现在我不想显示所有颜色作为选择,而是只显示保存在另一个模型的 ManyToManyField
中的颜色实例。另一个模型是设计:
class Design(models.Model):
color = models.ManyToManyField('maker.Color')
# ...
这在使用 ModelForm
时完全可行吗?
尝试
我已经尝试通过 ModelForm 的设计和设置实例来做到这一点:
class ColorForm(ModelForm):
class Meta:
model = Design
fields = ['color']
然后在视图中:
color_form = ColorForm(instance=design)
但我不太明白设置实例的作用,我认为实例不是我要找的,因为它仍然列出了所有颜色。
instance
设置与限制选择无关。本质上,它只是用特定记录中的值填充表单的值。您通常在编辑操作中提供实例,而在添加操作中跳过它。
models.ManyToManyField
在 ModelForm
中的表示是 forms.ChoiceField
,您可以简单地覆盖它的 queryset
属性,并指定查询集你想要的。
因此,在您看来:
form = OrderForm()
form.fields['color'].queryset = Design.object.all() # for example