Get nested elements with Jinja2 in Flask

for this dictionary with this Flask controller

projects = { 'life-calc':{'url':'life-calc', 'title': 'Life Calculator'}, 'text-game':{'url':'text-game', 'title':'Text Adventure'}, 'fill-it-up':{'url':'fill-it-up', 'title':'Fill It Up'}, 'rock-paper-scissors':{'url':'rock-paper-scissors', 'title':'Rock, Paper, Scissors'}, 'bubble-popper':{'url':'bubble-popper', 'title':'Bubble Popper'} } @app.route('/') def index(): return render_template("index.html", projects = projects) 

and the template as such

  <h1> List of My Projects </h1> <ol> <li> <a href = "life-calc">Life Calculator</a> </li> <li> <a href = "text-game">Adventure Game</a> </li> <li> <a href = "fill-it-up">Fill It Up</a> </li> <li> <a href = "rock-paper-scissors">Rock Paper Scissors</a> </li> <li> <a href = "bubble-popper">Bubble Popper</a> </li> </ol> <p>test section below</p> <ol> {% for project in projects %} <li><a href = "{{ project['url'] }}">{{ project['title'] }}</a> </li> {% endfor %} </ol> {% endblock %} 

How can I access the elements in a dict to print a list of my projects, as in the HTML above the test?

I solved my own problem using python code rendering in Jinja2 / Werkzeug The template block should be

 {% for key, value in projects.iteritems() %} <li><a href={{value['url']}}>{{value['title']}}</a></li> {% endfor %} 

But I'm still interested in learning how to access additional nested dictionaries, and if this is the smartest way to create a simple menu.

+7
python dictionary flask jinja2
source share
2 answers

I think you want to know how to access a nested dict in a template

If you think I got your question

This is usually a way to access nested dictionary items in a dictionary.

If iterators become nested further, you need to increase the forloop depth forloop , whether it be a list or a dict.

Here I give only a general example in your own way for your understanding

Data:

 parent_dict = {1: {'A':'val1','B':'val2'}, 2:{'C':'val3','D':'val4'}} 

iteration in jinja2:

 {% for key,parent_dict_item in parent_dict.items() %} {% for key2, nested_value in parent_dict_item.items() %} <li><a href = "{{ nested_value }}">{{ nested_value }}</a> </li> {% endfor %} {% endfor %} 

Answer:

 <li><a href="val1">val1</a> </li> <li><a href="val2">val2</a> </li> <li><a href="val3">val3</a> </li> <li><a href="val4">val4</a> </li> 
+13
source share

Instead of expanding the key and value in a loop, you can also use the key to refer to an element in the dict itself:

 {% for project in projects %} <li><a href = "{{ projects[project].url }}">{{ projects[project].title }}</a> </li> {% endfor %} 
+4
source share

All Articles