如何在Django表单中嵌套内联表单集?
我希望这个问题还没有被问过,但我想知道是否可以有一个普通的基于类的表单,用来处理一个对象,同时在里面嵌套一个内联表单集,用来编辑与这个对象相关的其他对象。
比如说,我有一个联系人模型
class Contact(models.Model):
...
还有一个沟通模型
class Communication(models.Model):
contact = models.ForeignKey(Contact)
我想要一个联系人表单,并在里面嵌套一个内联表单集,用来管理与这个联系人相关的沟通记录。
这样做是否可能,还是说我在做无用的梦呢?
补充:我知道后台管理面板可以做到这一点,但我该如何在视图中实现呢?
1 个回答
18
当然是可以的——你觉得管理员是怎么做到的呢?
你可以看看这个内联表单集的文档。
在评论后编辑 当然,你需要创建并显示父表单和嵌套的表单集。可以像这样:
def edit_contact(request, contact_pk=None):
if contact_pk:
my_contact = Contact.objects.get(pk=contact_pk)
else:
my_contact = Contact()
CommunicationFormSet = inlineformset_factory(Contact, Communication)
if request.POST:
contact_form = ContactForm(request.POST, instance=my_contact)
communication_set = CommunicationFormSet(request.POST,
instance=my_contact)
if contact_form.is_valid() and communication_set.is_valid():
contact_form.save()
communication_set.save()
else:
contact_form = ContactForm(instance=my_contact)
communication_set = CommunicationFormSet(instance=my_contact)
return render_to_response('my_template.html',
{'form': contact_form, 'formset':communication_set})
而模板可以简单到这样的程度:
<form action="" method="POST">
{{ form.as_p }}
{{ formset }}
</form>
不过你可能会想在显示上稍微详细一些。