2011-04-01 53 views
15

Espero que esta pregunta aún no se haya preguntado, pero quiero saber si es posible tener un formulario normal basado en clases para un objeto y tener un formset en línea dentro de él para editar sus objetos relacionados.¿Cómo tener un formset en línea anidado dentro de un formulario en Django?

Por ejemplo, tengo un modelo de contacto
class Contact(models.Model):
...

y un modelo de comunicación
class Communication(models.Model):
contact = models.ForeignKey(Contact)

y yo quiero tener una forma para el contacto con un juego de formularios en línea anidado en él para gestionar las comunicaciones relacionadas lo.

¿Es posible hacerlo con componentes existentes o tengo un sueño sin esperanza?

EDIT: Sé que el panel de administración lo hace, pero ¿cómo hago el trabajo en una vista?

Respuesta

14

Por supuesto que es posible, ¿cómo crees que lo hace el administrador?

Eche un vistazo a inline formsets documentation.

Editado después del comentario Por supuesto, debe instanciar y representar tanto el formulario principal como el formset anidado. Algo así como:

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

y la plantilla puede ser tan simple como:

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

aunque es probable que desee ser un poco más detallada de cómo la procesa.

+0

Gracias por la respuesta rápida, pero lo probé y cuando renderizo el formset, solo hay líneas para los objetos relacionados. Necesito el formulario de contacto Y el formulario de comunicación en línea. Sé que el panel de administración lo hace, pero ¿cómo trabajo en una vista? –

+0

¡Gracias funcionó como un encanto! –

+0

¿hay alguna forma de agregar el formset al formulario principal? por alguna razón, puedo tener una única forma de modelo y necesito un conjunto en línea dentro de ella. –

Cuestiones relacionadas