python - fields - formularios personalizados django
Formularios Django-Cómo usar el parámetro de prefijo (2)
Procesa cada formulario como lo haría normalmente, asegurándose de que crea instancias que tienen los mismos prefijos que los utilizados para generar el formulario inicialmente.
Este es un ejemplo un tanto incómodo al usar el formulario que ha proporcionado, ya que no sé cuál es el caso de uso exacto:
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,
})
Aquí hay un código de ejemplo del mundo real que demuestra el procesamiento de formularios usando el prefijo:
http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/
Digamos que tengo un formulario como:
class GeneralForm(forms.Form):
field1 = forms.IntegerField(required=False)
field2 = forms. IntegerField(required=False)
Y quiero mostrarlo 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 consigo que el formulario enviado vuelva a estar en dos formularios separados para hacer la validación y volver a mostrarlo?
Esta fue la única documentación que pude encontrar y es pecaminosa.
Mejor aún, creo que 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))
Incluso puede tener un formset generado automáticamente a partir de un modelo con modelformset_factory , que son utilizados por el administrador de django automatizado. FormSet maneja incluso más cosas que formularios simples, como agregar, eliminar y clasificar elementos.