如何在 Django 的表单中拥有嵌套的内联表单集?

Posted

技术标签:

【中文标题】如何在 Django 的表单中拥有嵌套的内联表单集?【英文标题】:How to have a nested inline formset within a form in Django? 【发布时间】:2011-07-27 23:47:00 【问题描述】:

我希望这个问题还没有被问到,但我想知道是否有可能为对象提供一个基于类的普通表单,并在其中包含一个内联表单集来编辑其相关对象。

例如,我有一个联系人模型

class Contact(models.Model):
    ...

以及通信模型

class Communication(models.Model):
   contact = models.ForeignKey(Contact)

我想要一个用于联系人的表单,其中嵌套了一个内联表单集,用于管理与其相关的通信。

是否可以使用现有组件来实现,还是我有一个无望的梦想?

编辑:我知道管理面板可以做到这一点,但我如何在视图中工作?

【问题讨论】:

【参考方案1】:

当然有可能——你认为管理员是怎么做到的?

看看inline formsets documentation。

注释后编辑 当然,您需要实例化和渲染父表单和嵌套表单集。比如:

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>

尽管您可能希望更详细地了解如何渲染它。

【讨论】:

感谢您的快速回答,但我试过了,当我渲染表单集时,只有相关对象的行。我需要联系表格和通讯内联表格集。我知道管理面板可以做到这一点,但我如何在视图中工作? 有什么办法可以将表单集添加到主表单中?由于某些原因,我只能有一个模型表单,并且我需要一个内联表单集。 “内联表单集文档”的链接产生 404 错误

以上是关于如何在 Django 的表单中拥有嵌套的内联表单集?的主要内容,如果未能解决你的问题,请参考以下文章

Django内联表单集错误

Django:如何更改内联表单集中的字段小部件

单元测试 django 内联表单集

如何使用 django-extra-views 将请求传递到内联表单集中

在模板中访问内联表单集的父级?

django 脆表单:在表单中嵌套表单集