2012-05-30 44 views
6

uno de los formularios que necesito es un compuesto de campos simples (digamos "Departamento", "Edificio" y "Número de habitación") y de pares de campos generados dinámicamente (digamos "Nombre" y " Email"). Lo ideal sería editar los contenidos de los campos simples y agregar/eliminar pares de campos dinámicos en un solo formulario.Django: Formset como campo de formulario

Code-wise, me pregunto si tratar de insertar un Formset (de un formulario con los dos campos dinámicos) como un campo en una forma ordinaria es un enfoque sensato o si hay otra mejor práctica para lograr lo que ' me gusta lograr.

Muchas gracias por cualquier consejo sobre estos asuntos,

+0

Necesitamos un código para comenzar a trabajar =) – okm

Respuesta

8

No estoy seguro de que la idea de que es necesario "incrustar un formset como un campo" proviene; esto suena como un caso para el standard usage of formsets.

Por ejemplo (haciendo toda una serie de suposiciones acerca de sus modelos):

class OfficeForm(forms.Form): 
    department = forms.ModelChoiceField(... 
    room_number = forms.IntegerField(... 

class StaffForm(forms.Form): 
    name = forms.CharField(max_length=... 
    email = forms.EmailField(... 

from django.forms.formsets import formset_factory 

StaffFormSet = formset_factory(StaffForm) 

Y luego, para su punto de vista:

def add_office(request): 
    if request.method == 'POST': 
     form = OfficeForm(request.POST) 
     formset = StaffFormSet(request.POST) 

     if form.is_valid() && formset.is_valid(): 
      # process form data 
      # redirect to success page 
    else: 
     form = OfficeForm() 
     formset = StaffFormSet() 

    # render the form template with `form` and `formset` in the context dict 

mejoras posibles:

  • Use las django-dynamic-formset jQuery plugin para obtener la funcionalidad de "agregar una cantidad arbitraria de personal a una oficina" probablemente deseada sin mostrarle busca una pila de formularios en blanco todo el tiempo.
  • En su lugar, use model formsets (suponiendo que la información que está recopilando está respaldada por modelos de Django), por lo que no tiene que especificar explícitamente los nombres o tipos de campo.

Espero que esto ayude.

+1

Gracias por señalar esto. Fui engañado por el hecho de que pensé (quién sabe por qué), que sería más práctico si el 'StaffFormSet' de alguna manera se declarase como un campo del' OfficeForm'. Voy a intentar tu enfoque. – Mark

+0

También pensé erróneamente que el formset debería ser un campo en el formulario, pero esta respuesta ayudó. Para agregar a la respuesta, en su plantilla, representará 'form' y' formset' dentro de la misma etiqueta HTML 'form'. De esta forma, todos los datos del formulario vuelven en el mismo POST. – Seth

Cuestiones relacionadas