2008-10-22 13 views
17

Digamos que tiene una forma como:Formas de Django - Cómo utilizar el prefijo de parámetro

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

Y quiero mostrar dos veces en una página dentro de una etiqueta de formulario cada vez con un prefijo diferente, por ejemplo ,:

rest of page ... 
<form ..> 
GeneralForm(data,prefix="form1").as_table() 
GeneralForm(data,prefix="form2").as_table() 
<input type="submit" /> 
</form> 
rest of page ... 

Cuando el usuario envía esto, ¿cómo puedo obtener el formulario enviado nuevamente en dos formularios separados para hacer la validación y volver a mostrarlo?

This was the only documentation Pude encontrar y es un poco asqueroso.

Respuesta

31

Procesa cada formulario como lo haría normalmente, asegurándose de crear instancias que tienen los mismos prefijos que los utilizados para generar el formulario inicialmente.

Aquí está un ejemplo un poco incómodo el uso de la forma que le has dado, ya que no sé lo que el caso de uso exacto es:

def some_view(request): 
    if request.method == 'POST': 
     form1 = GeneralForm(request.POST, prefix='form1') 
     form2 = GeneralForm(request.POST, prefix='form2') 
     if all([form1.is_valid(), form2.is_valid()]): 
      pass # Do stuff with the forms 
    else: 
     form1 = GeneralForm(prefix='form1') 
     form2 = GeneralForm(prefix='form2') 
    return render_to_response('some_template.html', { 
     'form1': form1, 
     'form2': form2, 
    }) 

He aquí algunos ejemplos de código del mundo real que demuestra las formas de procesamiento utilizando el prefijo:

http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

+0

¡Gracias, eso es exactamente lo que estaba buscando! – Greg

5

Aún mejor, creo formsets es exactamente lo que estás buscando.

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

from django.forms.formsets import formset_factory 

# GeneralSet is a formset with 2 occurrences of GeneralForm 
# (as a formset allows the user to add new items, this enforces 
# 2 fixed items, no less, no more) 
GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2) 

# example view 

def someview(request): 
    general_set = GeneralSet(request.POST) 
    if general_set.is_valid(): 
     for form in general_set.forms: 
      # do something with data 
    return render_to_response("template.html", {'form': general_set}, RequestContext(request)) 

Puede incluso tener un juego de formularios generados automáticamente a partir de un modelo con modelformset_factory, que son utilizados por la administración de Django automatizado. FormSet maneja incluso más cosas que formularios simples, como agregar, eliminar y clasificar elementos.

Cuestiones relacionadas