如何在Django Formset中更新多个实例的外键

时间:2020-06-08 23:33:28

标签: django

创建新的Child时,我只需要显示所有Parent实例的列表,而无需父实例,因此用户可以在要添加到的实例前面设置复选框这个父母 怎么处理呢?

我需要让人们为Django表单集中的多个Child实例分配外键。我不知道该怎么做:

models.py

class Parent(models.Model):
   pass

class Child(models.Model):
   owner = models.ForeignKey(to=Parent, null=True)

forms.py


class PartFormset(forms.BaseInlineFormSet):
    model = Child

    def get_queryset(self):
        return self.model.objects.filter(owner__isnull=True)

MyFormSet = inlineformset_factory(parent_model=Parent,
                                      model=Child,
                                      formset=PartFormset,
                                      extra=0,
                                      can_delete=False,
                                      )

这个显然不起作用,因为inlineformset_factory遗漏了fields参数。但是,如果我提供“所有者”作为字段,那当然也不起作用。

1 个答案:

答案 0 :(得分:1)

ModelChoiceField是ModelForm中pk或外键字段的默认字段,但是有趣的一点是BaseInlineFormSet中的add_fields()方法将外键form_field重写为InlineForeignKeyField,而HiddenInput是InlineForeignKeyField的默认小部件。因此客户端浏览器不会显示该字段。要进行如下修复。

class PartFormset(forms.BaseInlineFormSet):
    model = Child

    def get_queryset(self):
        return self.model.objects.filter(owner__isnull=True)

    # it works as your mind with jumping over the related method of BaseInlineFormSet, 
    # but you need notice the validate and clean stuff
    def add_fields(self, form, index):
        super(forms.BaseInlineFormSet, self).add_fields(form, index)