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.
我设法使用 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=True到OneToOneField将允许您引用父级的列,就好像它们是子级的列一样。
例如:
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)
如果您不熟悉模型继承,我会查看官方文档。
| 归档时间: |
|
| 查看次数: |
2294 次 |
| 最近记录: |