Search code examples
pythongoogle-app-enginejinja2webapp2

Webapp2 Jinja2 Dict in List in Dict


I have the following context dict:

context={'idp': []}

Later on, I append a few dicts into the list:

context['idp'].append({'provider','login_url'})
context['idp'].append({'provider','login_url'})
context['idp'].append({'provider','login_url'})

Then the following will print out the list above

self.response.write(context['idp'])

Now, how would I print this out in Jinja2? I tried;

{% for provider, login_url in idp %}

<p><a href="{{ login_url }}">{{ provider }}</a></p>

{% endfor %}

But the output is blank. <p><a href=""></a></p>


Solution

  • As Sam already mentioned those aren't dicts, buts sets. Sets are not supporting indexing so you won't be able to distinguish what is what if you are just adding strings. You can either append a list or an actual dict.

    If you append list:

    context['idp'].append(['provider', 'login_url'])
    context['idp'].append(['provider', 'login_url'])
    context['idp'].append(['provider', 'login_url'])
    

    Then you could:

    {% for item in idp %}
       <p><a href="{{item[1]}}">{{item[0]}}</a></p>
    {% endfor %}
    

    If you want to use dictionary then:

    context['idp'].append({'provider':'google','login_url':'http://example.com/login/google'})
    context['idp'].append({'provider':'facebook','login_url':'http://example.com/login/facebook'})
    context['idp'].append({'provider':'twitter','login_url':'http://example.com/login/twitter'})
    

    And the Jinja2 template would look like this:

    {% for item in idp %}
       <p><a href="{{item['login_url']}}">{{item['provider']}}</a></p>
    {% endfor %}