Django表格与一对多的关系

时间:2014-01-10 14:20:33

标签: python django django-forms

我在Django中有一个名为PersonForm的表单,这个表单模型与Car有一个一对多的关系。当像Django Admin一样显示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 个答案:

答案 0 :(得分:11)

听起来像你想要an inline model form。这使您能够在Person表单中的Person中添加/删除Car对象。

之前的链接是针对inlinemodeladmin的。下一个链接用于内联形式: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelforms-factory

答案 1 :(得分:1)

我没有任何机会使用内联formset,所以我建议覆盖你的模型保存方法,我觉得它更干嘛:

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

答案 2 :(得分:0)

我知道这是一个旧线程,但由于我发现自己在搜索时几乎完全被谷歌指向这里,我想我会为其他寻找答案的人提供以下内容。

我认为答案是使用

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

但它也适用于一对多领域。这些允许我们根据模型中的相关字段生成具有多个选项的表单作为复选框或类似的小部件。