2010-03-10 14 views
8

Estoy tratando de automatizar la creación de algo como esto:Django: crear la matriz de entrada HTML usando una forma Django

<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 

Por ciclismo a través de un rango en el formulario. He estado tratando de cosas como esta, junto con varias otras variaciones:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf'] = forms.CharField(label=i) 

# in the template 
<form action='#' method='post'> 
    {{form.as_p}} 
</form> 

Pero no he tenido ninguna suerte sin embargo.

¿Cómo puedo automatizar una serie de entradas?

** editar ** Para aclarar, finalmente, tengo que ser capaz de acceder a los campos de la plantilla de la siguiente manera:

{% for input in form.fields.asdf %} 
{{input}} 
{% endfor %} 

que entonces es de esperar que me obtener la lista de entrada original se muestra arriba .. .

+0

Su bucle está creando un nuevo CharField con una etiqueta no válida (no puede ser un número entero) y sobrescribiendo self.field ['asdf']. No estoy seguro de qué es lo que intentas hacer. ¿Quiere decir que usa el atributo de opciones? –

+0

Sí, esa versión particular de ella simplemente sobrescribe. Antes tenía código más complicado que se intentó crear listas y/o diccionarios, pero tampoco pude hacer que funcionaran. – Brant

+0

Quizás podría hacer que su etiqueta sea 'asdf' o algo así, luego recorra todos los campos, dándole salida si '{% ifequal field.label 'asdf'%}' coincide, y luego use 'forloop.counter' para mostrar 1, 2 , 3, etc. Actualicé mi respuesta a continuación. –

Respuesta

1

debería ser más como por ejemplo:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i) 

Pero es muy depende de lo que quiere lograr.

+0

No quiero que los campos tengan nombres diferentes cuando se publican. – Brant

+1

¿Hay alguna razón en particular por la que no desee nombres de campos diferentes? Sólo curioso. –

+0

@Brant: Bueno, obviamente, un diccionario no puede contener más de un valor para una clave.En su código, está sobrescribiendo el campo una y otra vez. –

7

Jacob Kaplan-Moss (co-autor de Django) recientemente publicado un gran artículo para el manejo de las formas dinámicas, que debería resolver su problema de una manera preferida: http://jacobian.org/writing/dynamic-form-generation/

Está usando el mismo método que Félix sugiere, pero vale la pena leer todo el artículo para obtener una mejor comprensión del concepto.

El uso de la técnica asdf[] es descuidado, porque entonces tiene que encargarse de ordenar. Tampoco es la práctica estándar.

Editar:

Para hacer frente a la situación en la que necesita para detectar cuando se pulse estos campos dinámicos:

{% for input in form.fields %} 
    {% ifequal input.label 'asdf' %} 
     {{ forloop.counter }}: {{input}}<br /> 
    {% endifequal %} 
{% endfor %} 
+0

Así es como originalmente tenía las cosas configuradas. Desafortunadamente, no satisface mis necesidades. Hay un párrafo de texto de descripción que necesito insertar antes de que comiencen las entradas asdf [] ... y el número de entradas asdf [] debe ser dinámico. Entonces, debo ser capaz de detectar que las entradas asdf están a punto de comenzar, mostrar un párrafo y luego escupirlas todas. – Brant

+1

+1 Buen artículo al que te has vinculado. –

+0

Resumen del artículo: deje que su clase Form haga el trabajo pesado. Gran lectura. – Seth

Cuestiones relacionadas