es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  ,

Answer

  1. Avatar for 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:

    {% for object in objects %}
        {% with tags="" %}
            {% if object.bold %}
                {% with tags=tags+"<b>" %}
            {% endif %}
    
            {% if object.strikethrough %}
                {% with tags=tags+"<strike>" %}
            {% endif %}
    
            {% with tags=tags+object.name %}
    
            {% if object.strikethrough %}
                {% with tags=tags+"</strike>" %}
            {% endif %}
    
            {% if object.bold %}
                {% with tags=tags+"</b>" %}
            {% endif %}
    
            {{ tags }}
        {% endwith %}
    {% endfor %}
    

    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 variable tags en la plantilla. De esta manera, puedes evitar anidar las declaraciones if y lograr un código más limpio.

Comments are closed.