python - update - Variable número de entradas con formas de Django posible?
modelform django (3)
Si tu corres
python manage.py shell
y escriba:
from app.forms import PictureForm
p = PictureForm()
p.fields
type(p.fields)
verás que p.fields es un SortedDict. solo tienes que insertar un nuevo campo. Algo como
p.fields.insert(len(p.fields)-2, ''fieldname'', Field())
En este caso, insertaría antes del último campo, un nuevo campo. Ahora debe adaptarse a su código.
Otra alternativa es hacer un bucle for / while en su plantilla y hacer el formulario en HTML, pero django forma rock por alguna razón, ¿no?
¿Es posible tener un número variable de campos usando formularios django?
La aplicación específica es esta:
Un usuario puede cargar tantas fotos como desee en el formulario de carga de imágenes. Una vez que las imágenes se cargan, se llevan a una página donde pueden darles un nombre y una descripción. La cantidad de imágenes dependerá de la cantidad que el usuario haya elegido cargar.
Entonces, ¿ cómo obtengo que django genere un formulario usando una cantidad variable de campos de entrada (que podría pasar como un argumento si es necesario)?
editar: algunas cosas han cambiado desde que se escribió el artículo mencionado en la respuesta de jeff bauer .
A saber, esta línea de código que no parece funcionar:
# BAD CODE DO NOT USE!!!
return type(''ContactForm'', [forms.BaseForm], { ''base_fields'': fields })
Así que esto es lo que se me ocurrió ...
La respuesta que utilicé:
from tagging.forms import TagField
from django import forms
def make_tagPhotos_form(photoIdList):
"Expects a LIST of photo objects (ie. photo_sharing.models.photo)"
fields = {}
for id in photoIdList:
id = str(id)
fields[id+''_name''] = forms.CharField()
fields[id+''_tags''] = TagField()
fields[id+''_description''] = forms.CharField(widget=forms.Textarea)
return type(''tagPhotos'', (forms.BaseForm,), { ''base_fields'': fields })
El etiquetado de notas no forma parte de django, pero es gratuito y muy útil. échale un vistazo: django-tagging
Utilice formularios múltiples (django.forms.Form no la etiqueta)
class Foo(forms.Form):
field = forms.Charfield()
forms = [Foo(prefix=i) for i in xrange(x)]
o agregue varios campos al formulario dinámicamente usando self.fields.
class Bar(forms.Form):
def __init__(self, fields, *args, **kwargs):
super(Bar, self).__init__(*args, **kwargs)
for i in xrange(fields):
self.fields[''my_field_%i'' % i] = forms.Charfield()
Sí, es posible crear formularios dinámicamente en Django. Incluso puedes mezclar y combinar campos dinámicos con campos normales.
class EligibilityForm(forms.Form):
def __init__(self, *args, **kwargs):
super(EligibilityForm, self).__init__(*args, **kwargs)
# dynamic fields here ...
self.fields[''plan_id''] = CharField()
# normal fields here ...
date_requested = DateField()
Para una mejor elaboración de esta técnica, vea el artículo de James Bennett: ¿Entonces quiere una forma dinámica?