我想在表单中使用ManyToManyField
。我读到您应该为此使用MultipleChoiceField
。如何填充ManyToManyField
中的选项?
models.py
class BoatModel(models.Model):
title = models.CharField(max_length=80)
category = models.ManyToManyField(Category)
model_slug = AutoSlugField(null=True, default=None,
unique=True,
populate_from='title')
class Meta:
verbose_name_plural = "Models"
def __str__(self):
return self.title
class Category(models.Model):
title = models.CharField(max_length=50)
category_slug = AutoSlugField(null=True, default=None, unique=True, populate_from='title')
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.title
forms.py
class CreateModelForm(forms.ModelForm):
class Meta:
model = Model
fields = ('title', 'category',)
widgets = {
'title': forms.TextInput(attrs={'class': 'category-title-field', 'placeholder': 'Category title'}),
'category': forms.MultipleChoiceField(),
}
答案 0 :(得分:0)
您实际上需要一个ModelMultipleChoiceField,而不是MultipleChoiceField。幸运的是,对于ModelForm,django将自动为ManyToMany分配一个ModelMultipleChoiceField,默认情况下它将包括该模型的所有实例作为选择。
您应该能够从小部件中删除“类别”,并且应该可以正常工作。
窗口小部件字典应该用于显示在那个ModelMultipleChoiceField上使用哪个窗口小部件覆盖,而不是调用字段本身。仅在要添加任何属性,更改输入类型(例如,复选框或单选按钮)或更改查询集时,才需要调用该小部件。因此,如果您要使用“选择”并且只希望将类别的子集显示在表单上,则可以执行以下操作:
class CreateModelForm(forms.ModelForm):
class Meta:
model = Model
fields = ('title', 'category',)
widgets = {
'title': forms.TextInput(attrs={'class': 'category-title-field', 'placeholder': 'Category title'}),
'category': forms.SelectMultiple(queryset=Category.objects.filter(foo=bar),
}