从ManyToManyField填充MultipleChoiceField值

时间:2019-12-02 17:58:54

标签: django django-models django-forms

我想在表单中使用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(),

        }

1 个答案:

答案 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),

        }