Ed.
Ed.

Reputation: 4597

Determine order of iteration in django template for loop

I am populating a list in my view:

hits_object = {}
hits_object['Studio'] = hitlist('Studio',days)
hits_object['Film'] = hitlist('Film',days)
hits_object['Actor'] = hitlist('Actor',days)
hits_object['Historical Event'] = hitlist('Event',days)
hits_object['Pop Culture'] = hitlist('Pop_Culture',days)

Then I am displaying it in my template:

{% for model, hits in hits_object.items %}
    {% if hits %}
        <u> Most {{ model }} views in last {{ days }} days</u>
            <ol>
                {% for hit in hits %}
                    <li>{{ hit.name }} - {{ hit.count }}</li>
                {% endfor %}
            </ol>
        </u>
    {% endif %}
{% endfor %}

The problem is that the models display in a seemingly random order: first Actor, then Studio, Historical Event, Film, etc.

How can I force the for loop in the template to iterate the object in a specific order?

Upvotes: 0

Views: 1764

Answers (2)

Burhan Khalid
Burhan Khalid

Reputation: 174672

As Daniel explained, dictionaries are accessed randomly. Here is one way to do what you want:

hits_object = list()
hits_objects.append(
       (hitlist('Studio',days),
        hitlist('Film',days),
        hitlist('Actor',days),
        hitlist('Event',days),
        hitlist('Pop_Culture',days))

In your view:

{% for studio,film,actor,event,pop_culture in hits_objects %}
      # do something...
{% endfor %}

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599846

Dictionaries are unordered. If you need to preserve insertion order, use an ordered dict implementation - there's one in django.utils.datastructures.SortedDict, for example.

Or, since you don't seem to be using the key of the dictionary but are just iterating through, appending to a simple list would seem to be easier.

Upvotes: 2

Related Questions