2010-02-10 19 views
10

¿Cuál es la forma en que Django presenta un formset horizontalmente, es decir, una fila por formulario? El método as_table genera múltiples formularios verticalmente (con las etiquetas). Necesito los campos de formulario en las filas de la tabla (una fila por formulario) y las etiquetas deben estar en la parte superior. No veo nada fuera de la caja. ¿Esto se desalienta por alguna razón?Formas horizontales (por filas) en un formset de Django

Debo aclarar que en realidad quiero una mesa, a causa de un widget mesa de interfaz de usuario que va a utilizar. Y esa tabla debe tener las etiquetas en el.

Así que mi estructura deseada es:

<table> 
    <thead> 
    <tr><th>column1</th><th>column2</th></tr> 
    </thead> 
    <tbody> 
    <tr><td>form1.value1</td><td>form1.value2</td></tr> 
... 
    </tbody> 
</table> 

Respuesta

21

Es posible que desee probar algo como esto http://www.djangosnippets.org/snippets/1442/

{{ formset.non_form_errors.as_ul }} 
<table id="formset" class="form"> 
{% for form in formset.forms %} 
    {% if forloop.first %} 
    <thead><tr> 
    {% for field in form.visible_fields %} 
    <th>{{ field.label|capfirst }}</th> 
    {% endfor %} 
    </tr></thead> 
    {% endif %} 
    <tr class="{% cycle row1,row2 %}"> 
    {% for field in form.visible_fields %} 
    <td> 
    {# Include the hidden fields in the form #} 
    {% if forloop.first %} 
     {% for hidden in form.hidden_fields %} 
     {{ hidden }} 
     {% endfor %} 
    {% endif %} 
     {{ field.errors.as_ul }} 
     {{ field }} 
    </td> 
    {% endfor %} 
    </tr> 
{% endfor %} 
</table> 
+5

Sí, esto lo hace. Es algo detallado para poner en sus plantillas. Con algo tan detallado, lo querrías como un método similar a as_table o querrías tener la capacidad de llamar plantillas con un parámetro (no solo incluirlas). Estoy realmente sorprendido de que algo tan maduro como Django no tenga esto fuera de la caja. – kmt

+4

Normalmente agrego esto como una plantilla genérica (guardada como formset_table.html) luego para cada plantilla de conjunto de formularios que apruebo {% include "formset_table.html"%}, pero acepto que sería bueno que se pudiera representar como un método integrado . – Dave

+2

Terminé haciendo lo mismo. Y debido a que tengo una página con múltiples formularios, terminé usando la etiqueta con para parametrizarla. – kmt

6

sugiere emplear form.as_ul y el estilo con el CSS para que sea todo en una fila. Puede hacerlo con ul li { display: inline; } o, por supuesto, sustituir una clase o ID si no desea afectar a todos los UL de esa manera.

Aquí está la sección correspondiente de la documentación de Django: http://docs.djangoproject.com/en/dev/topics/forms/#displaying-a-form-using-a-template

Editar: Para hacer frente a sus necesidades de una mesa, desea querer hacer algo como esto ... editado un poco más.

Es difícil poner todos estos formularios en una tabla, y aún tener HTML válido. Un elemento de formulario puede rodear una tabla, o estar dentro de un <td> ... aunque esto probablemente aún funcione.

<thead> 
    <tr> 
    {% for field in form %} 
    <th>{{ field.label }}</th> 
    {% endfor %} 
    </tr> 
</thead> 

<tbody> 
<tr class="table_row"> 
    <form action="/something/" method="post"> 
    {% for field in form %} 
     <td> 
     <table> 
     <tr><td>{{ field.label }}</td></tr> 
     <tr><td>{{ field }}</td></tr> 
     </table> 
     </td> 
    {% endfor %} 
    </form> 
    </tr> 
</tbody> 
+0

Ver mi aclaración por favor. De hecho * necesito * una mesa. – kmt

+0

Creo que vas a tener que ir con la personalización en tu plantilla, entonces, en lugar de usar los métodos que automáticamente generan HTML. Entonces puedes ponerlo todo en uno ''. – JAL

+0

Veo su actualización. ¡Gracias! Pero, bueno, necesito que las etiquetas estén en el , sobre todas las filas, sin repetir para cada fila individual. Básicamente necesito una representación de tabla de un conjunto de registros. Me resulta sorprendente que no pude encontrar este Google. – kmt

Cuestiones relacionadas