如何在Django中的表单中使用嵌套的内联formset?

Mar*_*eux 16 python django django-templates django-forms

我希望这个问题还没有被提出,但是我想知道是否有可能为一个对象创建一个普通的基于类的表单,并在其中有一个内联的formset来编辑它的相关对象.

例如,我有一个Contact模型

class Contact(models.Model):
    ...
Run Code Online (Sandbox Code Playgroud)


和沟通模式

class Communication(models.Model):
   contact = models.ForeignKey(Contact)
Run Code Online (Sandbox Code Playgroud)


我希望有一个表格用于联系嵌套在其中的内联formset,用于管理与之相关的通信.

是否可以使用现有组件这样做,还是我有一个绝望的梦想?

编辑:我知道管理面板会这样做,但我如何在视图中进行工作?

Dan*_*man 15

当然有可能 - 您认为管理员如何做到这一点?

看一下内联formset文档.

注释后编辑当然,您需要实例化并呈现父表单和嵌套表单集.就像是:

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})
Run Code Online (Sandbox Code Playgroud)

模板可以很简单:

<form action="" method="POST">
  {{ form.as_p }}
  {{ formset }}
</form>
Run Code Online (Sandbox Code Playgroud)

虽然您可能希望在渲染方式上更加详细一些.