I have a database that looks like this:
Name | Phone_no | Country | Zipcode ----------------------------------- Foo | 12345 | USA | 92121 Bar | 65745 | UK | 15409 Arm | 77745 | UAE | 88844 Mac | 88845 | USA | 66623 Dox | 99945 | UAE | 52624
and I want to group the rows on country and display with something like this:
{% for country in addr_db|selectattr('country')|unique|list %} <h1> {country} </h1> {% for item in addr_db | selectattr('country', 'equalto', country) %} <p>{item.name}<p><br> {% endfor %} {% endfor %}
The above doesn’t seem to work as the first for loop results in the following error:
unhashable type: 'collections.OrderedDict'
Is it possible to extract just one column, and use that to group the rows, just by using jinja2 (i.e. no additional massaging of the database using python) ?
Advertisement
Answer
The error you are seeing is caused by selectattr
as it filters and returns a list of dictionaries, and dictionaries are not hashable types. In order to fix this, you can use the map
filter to extract the country field from each dictionary and return a list of strings instead:
{% for country in addr_db|selectattr('country')|map(attribute='country')|unique|list %} <h1> {{ country }} </h1> {% for item in addr_db | selectattr('country', 'equalto', country) %} <p>{{ item.name }}<p><br> {% endfor %} {% endfor %}