2011-04-01 93 views
15

我希望這個問題還沒有被問到,但我想知道是否有可能爲一個對象創建一個基於類的正常表單,並且在其中有一個內聯formset來編輯它的相關對象。如何在Django中的表單中嵌套嵌入式表單集?

例如,我有一個接觸模型
class Contact(models.Model):
...

和通信模式
class Communication(models.Model):
contact = models.ForeignKey(Contact)

,我想有聯繫的表單與嵌套在其管理的相關通信的在線表單集到它。

是否可以用現有組件做到這一點,還是我有一個無望的夢想?

編輯:我知道管理面板這樣做,但我如何使視圖工作?

回答

14

當然這是可能的 - 你認爲管理員怎麼做?

看看inline formsets documentation

在評論之後編輯當然,您需要實例化並呈現父窗體和嵌套窗體集。雖然你可能會想在你如何使它有點更詳細的

<form action="" method="POST"> 
    {{ form.as_p }} 
    {{ formset }} 
</form> 

:喜歡的東西:

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}) 

和模板可以那樣簡單。

+0

感謝您的快速回答,但我嘗試過,當我渲染formset時,只有相關對象的行。我需要聯繫表單和通信內聯表單。我知道管理面板會這樣做,但我如何在視圖中進行工作? – 2011-04-01 21:08:29

+0

感謝它的工作就像一個魅力! – 2011-04-01 21:24:09

+0

有沒有辦法將formset添加到主窗體中?由於某些原因,我可以只有一個模型,我需要一個inlineformset。 – 2017-12-21 08:11:07