3

In a Django template, I use a for loop to display content.

This content is of 3 types. Each type has its own set of conditions, HTML and CSS.

I felt including all that processing in 1 template would make it tough to maintain the file. So instead I'm using template tags:

{% load get_display_type_1 %}
{% load get_display_type_2 %}
{% load get_display_type_3 %}

{% for item in content %}

    {% if item == '1' %}
        {% display_type_1 payload='foo' %}
    {% elif item == '2' %}
        {% display_type_2 payload='bar' %}
    {% elif item == '3' %}
        {% display_type_3 payload='foo bar' %}
    {% endif %}

{% endfor %}

And where, for example, the template tag called display_type_1 has the following code:

from django import template

register = template.Library()

@register.inclusion_tag(file_name='display_type_1.html')
def display_type_1(payload):
    return {'payload':payload}

Standard stuff so far.

But now take a look at the HTML template connected to the template tag:

{% load myfilter %}

<div class="type1">{{ payload|myfilter }}</div>

I.e. notice I'm loading a custom filter called myfilter here.

So here's the problem: in essence, I've called {% load myfilter %} within a for loop. How? Because the template tag itself resides in the parent template's for loop.

This has slower performance then if I had written everything in the parent template and loaded the filter once.

I don't ideally want to abandon using template tags in this way; I find it more maintainable. But I don't want to sacrifice performance by loading filters (etc.) in a for loop either.

Can someone help me improve this pattern, making it more optimal? An illustrative example would be great.


Note: this is a simplified example, the actual code is more complex

Hassan Baig
  • 15,055
  • 27
  • 102
  • 205
  • something like that might help? https://stackoverflow.com/questions/1184983/load-a-django-template-tag-library-for-all-views-by-default – dahrens Nov 16 '17 at 12:52
  • @dahrens: okay, but I don't want to include them in **all** templates. It's a huge project. However, thanks for the suggestion, it's something one can consider if all else fails. – Hassan Baig Nov 16 '17 at 12:54

0 Answers0