在Django中,如何在窗体中具有嵌套的内联窗体集?

2024-04-28 18:05:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

class Contact(models.Model):
    ...


以及一种沟通模式

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


我希望有一个表单,用于与嵌套在其中的内联表单集联系,以管理与之相关的通信。

有没有可能使用现有的组件,或者我有一个无望的梦想?

编辑:我知道是管理面板做的,但是如何在视图中工作呢?


Tags: 对象模型编辑表单modelmodels组件contact
1条回答
网友
1楼 · 发布于 2024-04-28 18:05:39

当然有可能-你觉得行政部是怎么做到的?

看看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>

尽管您可能希望在渲染的方式上更详细一些。

相关问题 更多 >