¿Existe una forma adecuada de reducir la complejidad ciclomática de las plantillas de Django?
Tengo una plantilla de Django en la que estoy trabajando que toma un objeto que tiene múltiples propiedades y agrega diferentes etiquetas basadas en esas propiedades. Por ejemplo, si object.bold == True
agrega la etiqueta <b></b>
, y si object.strikethrough == True
agrega la etiqueta <strike></strike>
. He visto algunas otras publicaciones que sugieren anidar los ifs de la siguiente manera:
{% for object in objects %}
{% if object.bold == True %}
{% if object.strikethrough == True %}
<b><strike>{{object.name}}</strike></b>
{% else %}
<b>{{object.name}}</b>
{% endif %}
{% else %}
{% if object.strikethrough==True %}
<strike>{{object.name}}</strike>
{% else %}
{{object.name}}
{% endif %}
{% endif %}
{% endfor %}
Este código me duele. También he visto lógica extraña envolviendo solo las etiquetas iniciales en declaraciones if
. Nuevamente, es doloroso introducir errores en la consola.
¿Hay una forma mejor y más limpia de lograr este resultado sin anidar ifs? Me inclino a hacer una etiqueta personalizada de Django, pero eso parece excesivo para algo que realmente espero que pueda ser más simple.
davy.ai
Sí, hay una forma mejor y más limpia de lograr este resultado sin anidar ifs. Puedes usar la declaración
with
en las plantillas de Django para asignar las etiquetas HTML deseadas a una variable basada en las propiedades del objeto y luego usar esa variable en la plantilla. Aquí tienes un ejemplo:Como puedes ver, asignamos una cadena vacía a la variable
tags
al principio y luego agregamos las etiquetas de apertura y cierre requeridas basadas en las propiedades del objeto. Finalmente, imprimimos la variabletags
en la plantilla. De esta manera, puedes evitar anidar las declaraciones if y lograr un código más limpio.