¿Cómo utilizar los condicionales en las plantillas Word?

Tabla de contenidos

En las plantillas Word de Athento puedes mostrar u ocultar contenido con condicionales Jinja.

Clave: muchos metadatos de texto se insertan en el contexto como Listing, no como str. Antes de comparar, convierte y normaliza.

Patrón recomendado (siempre)

Convierte a string, recorta espacios, pasa a minúsculas y unifica guiones bajos/espacios:

{% set valor = campo|string|trim|lower|replace('_', ' ') %}
{% if valor == 'persona física' -%}
  ... contenido si coincide ...
{%- else -%}
  ... contenido si NO coincide ...
{%- endif %}

No uses comillas tipográficas (“ ”). Usa comillas rectas ' o ".

No metas filtros entre paréntesis; Jinja encadena filtros sin ().

Campos Choice (Diccionario)

  • Lo que se compara es la etiqueta (label) del término, no el value interno.
  • Aun así, ese label suele llegar como Listing. Convierte y normaliza:
{# Ej.: metadata_tipodepersona = "Persona Física" (label) #}
{% set tipo = metadata_tipodepersona|string|trim|lower|replace('_', ' ') %}
{% if tipo == 'persona física' -%}
Pinta: El valor del campo es X
{%- else -%}
Pinta: El valor del campo NO es X
{%- endif %}

Campos de texto / área de texto

También llegan como Listing. Usa el mismo patrón:

{% set nombre = metadata_nombre|string|trim %}
{% if nombre %}
  Nombre: {{ nombre }}
{% endif %}

 

Campos booleanos

El parser añade _boolean. Puedes usarlos directamente (ya son booleanos):

{% if metadataprueba_boolean -%}
El campo es true
{%- else -%}
El campo es false
{%- endif %}

 

Depuración rápida (para saber por qué no entra al if)

Imprime temporalmente el tipo real y el valor:

Tipo real: {{ metadata_tipodepersona.__class__ }}
Valor sin normalizar: {{ metadata_tipodepersona }}
Valor normalizado: {{ (metadata_tipodepersona|string|trim|lower|replace('_', ' ')) }}

Si ves <class 'docxtpl.listing.Listing'>, necesitas |string antes de comparar.

 

Ejemplo completo (Choice robusto)

{# Campo diccionario con label "Persona Física" #}
{% set tipo = metadata_tipodepersona|string|trim|lower|replace('_', ' ') %}

{% if tipo == 'persona física' -%}
Mostramos bloque para Persona Física.
{%- else -%}
Mostramos bloque alternativo (no PF). Valor: {{ metadata_tipodepersona }}
{%- endif %}

 

Errores frecuentes (y cómo evitarlos)

  • Comparar sin convertir: if campo == "…" → puede fallar (campo es Listing).
    • Solución: campo|string|trim|lower.
  • Comillas “inteligentes”: rompen el parser.
    • Solución: usa ' o " rectas.
  • Paréntesis en filtros: ({{ campo|string })|trim} → Jinja no lo necesita y puede fallar.
    • Solución: encadena sin paréntesis.
  • Espacios invisibles / variantes: "persona_fisica" vs "Persona Física".
    • Solución: |lower|replace('_',' ').