Mohamed Mohamed - 1 year ago 164
Python Question

how to access dictionary element in django template?

I have this code in template, which I would like to printout number of votes that each choice got. votes is just dictionary while choices are model object.

{% for choice in choices %}
{{choice.choice}} - {{votes[]}} <br />
{% endfor %}

it raises an exception with this message "Could not parse the remainder"

Answer Source

To echo / extend upon Jeff's comment, what I think you should aim for is simply a property in your Choice class that calculates the number of votes associated with that object:

    class Choice(models.Model):
        text = models.CharField(max_length=200) 

        def calculateVotes(self):
            return Vote.objects.filter(choice = self).count()

        votes = property(calculateVotes)

And then in your template, you can do:

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}

The template tag, is IMHO a bit overkill for this solution, but it's not a terrible solution either. The goal of templates in Django is to insulate you from code in your templates and vice-versa.

I'd try the above method and see what SQL the ORM generates as I'm not sure off the top of my head if it will pre-cache the properties and just create a subselect for the property or if it will iteratively / on-demand run the query to calculate vote count. But if it generates atrocious queries, you could always populate the property in your view with data you've collected yourself.