Как иметь вложенный встроенный набор форм внутри формы в Django? - PullRequest
16 голосов
/ 02 апреля 2011

Я надеюсь, что этот вопрос еще не задавался, но я хочу знать, возможно ли иметь для объекта обычную форму на основе классов и встроенный набор форм для редактирования связанных объектов.

Например, у меня есть модель контакта

class Contact(models.Model):
    ...


И модель связи

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


и я хочу иметь форму для Контакта с вложенным набором форм, вложенную в нее, для управления связями, связанными с ней.

Возможно ли это сделать с существующими компонентами или у меня безнадежный сон?

РЕДАКТИРОВАТЬ: Я знаю, что это делает админка, но как мне заставить работать в представлении?

1 Ответ

15 голосов
/ 02 апреля 2011

Конечно, это возможно - как вы думаете, админ это делает?

Ознакомьтесь с документацией inline formsets .

Отредактировано после комментария Конечно, вам нужно создать экземпляр и отобразить родительскую форму и вложенный набор форм. Что-то вроде:

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>

хотя вы, вероятно, захотите быть немного более детальным в том, как вы его визуализируете.

...