Django表单与一对多关系

22

我在Django中有一个名为PersonForm的表单,这个表单的模型与汽车存在一对多关系。当像Django管理后台一样显示PersonForm时,我想允许用户从汽车列表中进行选择/取消选择等操作。这是否可能?我正在寻找如何开始的信息。

这是我目前为PersonForm所做的:

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
        fields = ('description',)

模型:

class Person(models.Model):
    description = models.CharField(max_length="150")



class Car(models.Model):
    make = models.CharField(max_length="25")
    owner = models.ForeignKey('Person', related_name="Car")

在个人表单中,我需要显示一个汽车列表,这些汽车是该人的所有者,并允许进行选择/取消选择。我假设可以在表单中使用相关名称来实现这一点。

3个回答

13

2

我在使用内联表单集时没有任何机会,所以建议您覆盖模型的保存方法,我觉得这更加DRY:

class PersonForm(forms.ModelForm):
    # add a field to select a car
    car = forms.ModelChoiceField(car.objects.all())

    class Meta:
        model = Person
        fields = ('description', 'car')

     def save(self, commit=True):
        instance = super().save(commit)
        # set Car reverse foreign key from the Person model
        instance.car_set.add(self.cleaned_data['car']))
        return instance

1

我知道这是一个旧帖子,但由于在搜索时我发现自己几乎只有通过谷歌才找到了这里,所以我想为任何寻找答案的其他人提供以下内容。

我认为答案是使用

https://docs.djangoproject.com/en/3.1/ref/forms/fields/#modelchoicefield

或者

https://docs.djangoproject.com/en/3.1/ref/forms/fields/#modelmultiplechoicefield

有一篇关于如何使用ModelMultipleChoiceField的好文章,网址为:

https://medium.com/swlh/django-forms-for-many-to-many-fields-d977dec4b024

但是它同样适用于一个到多个字段。这使我们能够根据模型中的相关字段生成具有多个选项(如复选框或类似小部件)的表单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接