如何将父字段添加到 Django InlineFormSet?

Rei*_*ica 6 python django django-models django-forms

如何将字段添加到InlineFormSet

我的尝试:

模型.py:

from django.db import models

class Parent(models.Model):
    parent_name = models.CharField(max_length=45)

class Child(models.Model):
    child_name = models.CharField(max_length=45)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

形式.py:

from .models import Parent, Child
from django import forms

FormSet = forms.inlineformset_factory(Parent, Child, 
          fields='__all__'
)
Run Code Online (Sandbox Code Playgroud)

视图.py:

from .models import Parent
from .forms import FormSet

def view(req):
    instance = Parent.objects.get(pk=1)
    form = FormSet(instance=instance)
Run Code Online (Sandbox Code Playgroud)

这会导致显示所有字段Child,但不会显示Parent.

Rei*_*ica 0

我设法使用 a 找到了解决方法OneToOneField,但是我仍然不知道如何在ForeignKey关系中做到这一点。

如果您有这样的父子关系:

class Parent(models.Model):
    parent_name = models.CharField(max_length=45)

class Child(models.Model):
    child_name = models.CharField(max_length=45)
    parent = models.OneToOneField(Parent, on_delete=models.CASCADE, parent_link=True)
Run Code Online (Sandbox Code Playgroud)

将键添加parent_link=TrueOneToOneField将允许您引用父级的列,就好像它们是子级的列一样。

例如:

c = Child.objects.get(id=1)
print(c.parent_name)
Run Code Online (Sandbox Code Playgroud)

另请注意,以下模型在功能上与上述模型相同:

class Parent(models.Model):
    parent_name = models.CharField(max_length=45)

class Child(Parent):
    child_name = models.CharField(max_length=45)
Run Code Online (Sandbox Code Playgroud)

ModelForm这个概念也延伸到任何领域。

class SomeModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(SomeModelForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Child
        fields = ('parent_name', 'child_name')
Run Code Online (Sandbox Code Playgroud)

我还没有用 测试过这一点inlineformset_factory,但由于我们将Child模型视为模型的扩展Parent,因此不需要告诉formset_factory模型Parent,这modelformset_factory就是我们所需要的:

SomeModelFormSet = forms.modelformset_factory(Child, form=SomeModelForm)
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉模型继承,我会查看官方文档