prauchfuss
prauchfuss

Reputation: 1970

Django template object type

Alright, here's my situation. I've got an array of generic objects that I'm iterating over in a django template. Those objects have a number of subclasses and I want to figure out in the template which subclass I'm dealing with. Is this possible? Advisable?

The code might look something along the lines of (where the if statements include some imaginary syntax):

<table>
   <tr>
      <th>name</th>
      <th>home</th>
   </tr>
   {% for beer in fridge %}
   <tr>
      <td>
         {{ beer.name }}
      </td>
      <td>
          {% if beer is instance of domestic %}US of A{% endif %}
          {% if beer is instance of import %}Somewhere else{% endif %} 
      </td>
   </tr>
   {% endfor %}
</table>

Upvotes: 20

Views: 11900

Answers (2)

imiric
imiric

Reputation: 9030

This is an old question, but FWIW you can do this with a template filter.

@register.filter
def classname(obj):
    return obj.__class__.__name__

Then in your template you can do:

{% with beer|classname as modelclass %}
{% if modelclass == "Domestic" %}US of A
{% elif modelclass == "Import" %}Somewhere else
{% endif %}
{% endwith %}

Upvotes: 34

Daniel DiPaolo
Daniel DiPaolo

Reputation: 56408

You'll have to do it via some sort of method. Why not just write a method like display_location() or something on the model itself and have it return the string which gets rendered there? Then you could just put {{ beer.display_location }} in your template.

Or if you want to go really crazy, write a custom template tag that does what you want, but that's much more work.

Upvotes: 10

Related Questions