widgets template manually form fields errors django django-templates django-forms

template - submit django form



Obtenga el tipo de widget de formulario de Django desde la plantilla (4)

Estoy iterando a través de los campos de un formulario y para ciertos campos quiero un diseño ligeramente diferente, que requiere HTML alterado.

Para hacer esto con precisión, solo necesito saber el tipo de widget. Su nombre de clase o algo similar. En Python estándar, ¡esto es fácil! field.field.widget.__class__.__name__

Desafortunadamente, no tiene permitido el acceso a las variables de subrayado en las plantillas. ¡Estupendo!

Puede probar field.field.widget.input_type pero esto solo funciona para texto / contraseña <input ../> tipos. Necesito más resolución para eso.

Para mí, por difícil que parezca, tiene más sentido hacer esto en el nivel de la plantilla. He subcontratado el bit de código que maneja HTML para los campos en una plantilla separada que se incluye en el bucle de campo. Esto significa que es coherente en ModelForm y en los Form estándar (algo que no sería cierto si escribiera una clase de formulario intermediario).

Si puede ver un enfoque universal que no me obligue a editar 20 formularios distintos, ¡hágamelo saber también!


Hacer una etiqueta de plantilla podría funcionar? Algo así como field.field.widget|widget_type

Editar desde Oli: ¡Buen punto! Acabo de escribir un filtro:

from django import template register = template.Library() @register.filter(''klass'') def klass(ob): return ob.__class__.__name__

Y ahora {{ object|klass }} representa correctamente. Ahora tengo que descubrir cómo usar eso dentro de la declaración if una plantilla.

Editar desde Oli # 2: Necesitaba usar el resultado de eso en una declaración if en plantilla, así que simplemente cambié toda esa lógica a la plantilla. Magia. Gracias por empujarme en la dirección correcta.


Seguimiento de la respuesta aceptada: la if tag mejorada if tag en Django 1.2 le permite usar filtros en comparaciones de if tag . Así que ahora puedes hacer tu html / logic personalizado en la plantilla como sigue:

<ul> {% for field in form.fields %} <li> {% if field.field.widget|klass == "Textarea" %} <!-- do something special for Textarea --> <h2>Text Areas are Special </h2> {% else %} {{ field.errors }} {{ field.label_tag }} {{ field }} {% endif %} </li> {% endfor %} </ul>


Siguiendo la respuesta de Oli y rinti: utilicé este y creo que es un poco más simple:

código de plantilla: {{ field|fieldtype }}

código de filtro:

from django import template register = template.Library() @register.filter(''fieldtype'') def fieldtype(field): return field.field.widget.__class__.__name__


A partir de Django 1.11, puedes usar widget.input_type . Ejemplo:

{% for field in form.visible_fields %} <input type="{{ field.field.widget.input_type }}" id="{{ field.id_for_label }}" name="{{ field.html_name }}" placeholder="{{ field.label }}" maxlength="{{ field.field.max_length }}" /> {% endfor %}