Ten en cuenta que en las ciencias informáticas un problema casi siempre tiene diferentes soluciones, pero nosotros mostraremos lo más óptimo y eficiente.
Solución:
Jacob Kaplan-Moss tiene un artículo extenso sobre campos de formulario dinámico: http://jacobian.org/writing/dynamic-form-generation/
Esencialmente, agrega más elementos al formulario self.fields
diccionario durante la creación de instancias.
Aquí hay otra opción: ¿qué tal un formset? Dado que sus campos son todos iguales, eso es precisamente para lo que se utilizan los conjuntos de formularios.
El administrador de django usa FormSet
s + un poco de javascript para agregar líneas de longitud arbitraria.
class ColorForm(forms.Form):
color = forms.ChoiceField(choices=(('blue', 'Blue'), ('red', 'Red')))
ColorFormSet = formset_factory(ColorForm, extra=0)
# we'll dynamically create the elements, no need for any forms
def myview(request):
if request.method == "POST":
formset = ColorFormSet(request.POST)
for form in formset.forms:
print "You've picked 0".format(form.cleaned_data['color'])
else:
formset = ColorFormSet()
return render(request, 'template', 'formset': formset))
JavaScript
Plantilla
puedes hacerlo como
def __init__(self, n, *args, **kwargs):
super(your_form, self).__init__(*args, **kwargs)
for i in range(0, n):
self.fields["field_name %d" % i] = forms.CharField()
y cuando creas una instancia de formulario, solo haces
forms = your_form(n)
es solo la idea básica, puedes cambiar el código a lo que quieras. 😀
No se te olvide compartir esta crónica si lograste el éxito.