La API de renderizado de formularios

Los widgets de Django se renderizan utilizando el sistema de motores de plantillas de Django:doc:` </topics/templates>`.

El proceso de renderizado de formularios puede personalizarse a varios niveles:

  • Los widgets pueden especificar nombres de plantilla personalizados.

  • Las formas y los widgets pueden especificar clases de renderizador personalizadas.

  • La plantilla de un widget puede ser sobrescrita por un proyecto. (Las aplicaciones reutilizables suelen no sobrescribir las plantillas incorporadas porque podrían conflictuar con las plantillas personalizadas del proyecto.)

La API de renderizado a nivel bajo

El control de la renderización de las plantillas de formularios está controlado por una clase de renderizador personalizable. Una clase de renderizador personalizada se puede especificar actualizando la configuración FORM_RENDERER. Por defecto, es 'django.forms.renderers.DjangoTemplates'.

Al especificar un renderizador de formularios personalizado y sobrescribiendo el atributo form_template_name se puede ajustar la marcaje de formularios por defecto en todo el proyecto desde un solo lugar.

También puedes proporcionar un renderizador personalizado por-formulario o por-widget estableciendo el atributo Form.default_renderer o utilizando el argumento renderer del método Form.render(), o Widget.render().

Los puntos de coincidencia se aplican a la renderización de formularios. Consulta Utilizando conjuntos de formularios en vistas y plantillas para más información.

Utiliza uno de los renderizadores de plantillas de formularios incorporados o implementa tu propio. Los renderizadores personalizados deben implementar un método render(template_name, context, request=None). Debe devolver una plantilla renderizada (como una cadena) o levantar TemplateDoesNotExist.

class BaseRenderer[fuente]

La clase base para los renderizadores de formularios incorporados.

form_template_name

El nombre predeterminado del plantilla a utilizar para renderizar un formulario.

Por defecto utiliza la plantilla "django/forms/div.html".

formset_template_name

El nombre predeterminado de la plantilla a utilizar para renderizar un conjunto de formularios.

Por defecto utiliza la plantilla "django/forms/formsets/div.html".

field_template_name

El nombre predeterminado de la plantilla utilizada para renderizar una BoundField.

Por defecto utiliza la plantilla "django/forms/field.html"

bound_field_class

La clase predeterminada utilizada para representar campos formularios a lo largo del proyecto.

Por defecto utiliza la clase BoundField.

Esto se puede personalizar más aún utilizando Form.bound_field_class para sobrescribir por formulario o Field.bound_field_class para sobrescribir por campo.

get_template(template_name)[fuente]

Las subclases deben implementar este método con la lógica de búsqueda de plantillas adecuada.

render(template_name, context, request=None)[fuente]

Los textos traducidos son:

Formadores de plantillas integradas

DjangoTemplates

class DjangoTemplates[fuente]

Esta forma utiliza un motor de plantillas independiente DjangoTemplates (no conectado a lo que podrías haber configurado en la TEMPLATES configuración). Carga las plantillas primero desde el directorio de plantillas de formularios integradas en django/forms/templates y luego desde los directorios de plantillas de aplicaciones instaladas utilizando el cargador app_directories.

Si deseas renderizar plantillas con personalizaciones de tu TEMPLATES configuración, como procesadores de contexto por ejemplo, utiliza el formador TemplatesSetting.

class DjangoDivFormRenderer[fuente]

Obsoleto desde la versión 5.0.

El alias de DjangoTemplates.

Jinja2

class Jinja2[fuente]

Este formador es igual al formador DjangoTemplates excepto que utiliza un motor de plantillas Jinja2. Las plantillas para los widgets integrados se encuentran en django/forms/jinja2 y las aplicaciones instaladas pueden proporcionar plantillas en un directorio jinja2.

Para utilizar este motor, todas las formas y widgets de tu proyecto y sus aplicaciones terceras deben tener plantillas Jinja2. A menos que proporciones tus propias plantillas Jinja2 para los widgets que no tienen ninguna, no puedes utilizar este formador. Por ejemplo, django.contrib.admin no incluye plantillas Jinja2 para sus widgets debido a su uso de etiquetas de plantilla Django.

class Jinja2DivFormRenderer[fuente]

Obsoleto desde la versión 5.0.

El alias de Jinja2.

Configuración de plantillas

class TemplatesSetting[fuente]

Este renderizador te da un control completo sobre cómo se obtienen las plantillas de formulario y widget. Utiliza la función get_template() para encontrar plantillas según lo configurado en la TEMPLATES configuración.

Al utilizar este renderizador junto con las plantillas incorporadas, es necesario que:

  • 'django.forms' esté en INSTALLED_APPS y al menos un motor tenga APP_DIRS=True.

  • Agregar el directorio de plantillas incorporadas en DIRS de uno de los motores de plantillas. Para generar ese camino:

    import django
    
    django.__path__[0] + "/forms/templates"  # or '/forms/jinja2'
    

Al utilizar este renderizador debes asegurarte de que las plantillas de formulario que necesita tu proyecto puedan ser localizadas.

Contexto disponible en plantillas de formset

Las plantillas de formset reciben un contexto desde BaseFormSet.get_context(). Por defecto, los formsets reciben un diccionario con los siguientes valores:

  • formset: La instancia del conjunto de formularios.

Contexto disponible en plantillas de formulario

Los formularios de plantillas reciben un contexto desde Form.get_context(). Por defecto, los formularios reciben un diccionario con los siguientes valores:

  • form: El formulario vinculado.

  • fields: Todos los campos vinculados, excepto los campos ocultos.

  • hidden_fields: Todos los campos vinculados ocultos.

  • errors: Todas las errores del formulario no relacionados con el campo o ocultos.

Contexto disponible en las plantillas de campo

Las plantillas de campo reciben un contexto desde BoundField.get_context(). Por defecto, los campos reciben un diccionario con los siguientes valores:

Contexto disponible en las plantillas de widget

Las plantillas de widget reciben un contexto desde Widget.get_context(). Por defecto, los widgets reciben un valor único en el contexto, widget. Este es un diccionario que contiene valores como:

  • nombre

  • value

  • attrs

  • is_hidden

  • template_name

Algunos widgets agregan información adicional al contexto. Por ejemplo, todos los widgets que heredan de Input definen widget['type'] y MultiWidget define widget['subwidgets'] con fines de bucle.

Sobreescribiendo plantillas de formset predeterminadas

BaseFormSet.template_name

Para sobreescribir las plantillas de formset, debes utilizar el TemplatesSetting renderer. Luego, sobrescribir las plantillas de formset funciona de la misma manera que sobrescribiendo cualquier otra plantilla en tu proyecto.

Sobreescribiendo plantillas de formulario predeterminadas

Form.template_name

Para sobreescribir las plantillas de formulario, debes utilizar el TemplatesSetting renderer. Luego, sobrescribir las plantillas de formulario funciona de la misma manera que sobrescribiendo cualquier otra plantilla en tu proyecto.

Sobreescribiendo plantillas de campo predeterminadas

Field.template_name

Para sobreescribir las plantillas de campo, debes utilizar el TemplatesSetting renderer. Luego, sobrescribir las plantillas de campo funciona de la misma manera que sobrescribiendo cualquier otra plantilla en tu proyecto.

Sobreescribiendo plantillas de widget predeterminadas

Cada widget tiene un atributo template_name con un valor como input.html. Los templates de widgets integrados se almacenan en el camino django/forms/widgets. Puedes proporcionar un template personalizado para input.html definiendo django/forms/widgets/input.html, por ejemplo. Consulta widgets integrados para el nombre del template de cada widget.

Para sobreescribir los templates de widgets, debes utilizar el TemplatesSetting renderer. Luego, sobrescribir los templates de widgets funciona de la misma manera que sobrescribiendo cualquier otro template en tu proyecto.