Conditionals in Templates

14 views
Skip to first unread message

Russ Abbott

unread,
Jul 3, 2012, 3:50:15 PM7/3/12
to django...@googlegroups.com
I'm generating a table. I want the cells to be different depending on the type of the content. How do I test for the type of the content? I'd like to do something like this.

            <tbody>
            {% for row in rows %}
                <tr>
                    {% for cell in row %}
                        <td>
                                {% if isinstance( {{ cell }}, list) %}
                                    <ul>
                                    {% for element in cell %}
                                        <li>{{  element  }}</li>
                                    {% endfor %}
                                    <ul>
                                {% else %}
                                    {{ cell }}
                                {% endif %}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
            </tbody>

But "{% if isinstance( {{ cell }}, list) %}" is not allowed. Apparently I can't call a function in an {% if ...  %} tag.  Is there another way to do this?

Thanks.

Russ Abbott

unread,
Jul 3, 2012, 4:37:29 PM7/3/12
to django...@googlegroups.com
Here's a workaround I came up with.

I defined a class:

class TableValue:
    def __init__(self, value):
        self.value = value
        self.is_list = isinstance(value, list)

Then in the Template I wrote

            <tbody>
            {% for row in rows %}
                <tr>
                    {% for cell in row %}
                        <td>
                                {% if cell.is_list %}
                                    <ul>
                                    {% for element in cell.value %}
                                        <li>{{ element }}</li>
                                    {% endfor %}
                                    </ul>
                                {% else %}
                                    {{ cell.value }}
                                {% endif %}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
            </tbody>

Is that considered decent Django?

On Tuesday, July 3, 2012 12:50:15 PM UTC-7, Russ Abbott wrote:
I'm generating a table. I want the cells to be different depending on the type of the content. How do I test for the type of the content? I'd like to do something like this.

            <tbody>
            {% for row in rows %}
                <tr>
                    {% for cell in row %}
                        <td>
                                {% if isinstance( {{ cell }}, list) %}
                                    <ul>
                                    {% for element in cell %}
                                        <li>{{  element  }}</li>
                                    {% endfor %}
                                    </ul>
                                {% else %}
                                    {{ cell }}
                                {% endif %}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
            </tbody>

Bill Freeman

unread,
Jul 3, 2012, 4:39:27 PM7/3/12
to django...@googlegroups.com
The obvious ways are:

1. Provide a model method that returns a string representing the type
of the instance, compare against that
2. Decorate the instance with an attribute giving the name of the type
as a string...

Can't change the instance (I really think you can still decorate it in
the view, python is flexible that way, but), instead of rows of
instances, return rows of wrapper objects that have the type name as
above, and the original instance as another attribute.
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/django-users/-/jRlkDDGDgk0J.
> To post to this group, send email to django...@googlegroups.com.
> To unsubscribe from this group, send email to
> django-users...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.

Javier Guerra Giraldez

unread,
Jul 3, 2012, 6:49:05 PM7/3/12
to django...@googlegroups.com
On Tue, Jul 3, 2012 at 3:39 PM, Bill Freeman <ke1...@gmail.com> wrote:
> The obvious ways are:
>
> 1. Provide a model method that returns a string representing the type
> of the instance, compare against that
> 2. Decorate the instance with an attribute giving the name of the type
> as a string...

3. write a template tag


--
Javier

Melvyn Sopacua

unread,
Jul 4, 2012, 11:34:05 AM7/4/12
to django...@googlegroups.com
4. Don't use polymorphic variables in templates. Handle it in the view
by providing differently named variables (x and x_list for example).


--
Melvyn Sopacua


Reply all
Reply to author
Forward
0 new messages