Reputation: 12054
I have an list of dict in Python as follows:
options = [
{'group_priority': 2, 'group': u'Comfort', 'name': u'Air conditioning'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Air suspension'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Cruise control'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Leather interior'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Parking assist system camera'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Parking assist system sensors rear'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Power steering'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Seat heating'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Sunroof'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'Bluetooth'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'MP3'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'Navigation system'},
{'group_priority': 4, 'group': u'Extra', 'name': u'Alloy wheels'},
{'group_priority': 4, 'group': u'Extra', 'name': u'Trailer hitch'},
{'group_priority': 4, 'group': u'Extra', 'name': u'Winter tyres'},
{'group_priority': 4, 'group': u'Security', 'name': u'Xenon headlights'}]
I want to order it by group_priority
and group it by group
and show it in Django template/
What I have tried:
options_grouped_dict = {}
for item in options_grouped:
options_grouped_dict.setdefault(item['group'], []).append(item['name'])
And then in Django template:
{% for key, values in car.options_grouped.items %}
<div>
<div><strong>{{key}}</strong></div>
{% for option in values %}
<div>
{% if option|length > 31 %}
{{ option|truncatechars:34 }}
{% else %}
{{ option }}
{% endif %}
</div>
{% endfor %}
</div>
{% endfor %}
But it isn't ordered by group_priority
. I get group security
on first place instead of group Comfort
Any advice?
Upvotes: 0
Views: 700
Reputation: 12054
I solve it using Django's regroup.
The options list is as follows:
options = [
{'group_priority': 2, 'group': u'Comfort', 'name': u'Air conditioning'},
{'group_priority': 2, 'group': u'Comfort', 'name': u'Air suspension'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'Bluetooth'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'MP3'},
{'group_priority': 3, 'group': u'Entertainment', 'name': u'Navigation system'},
{'group_priority': 4, 'group': u'Extra', 'name': u'Alloy wheels'},
{'group_priority': 4, 'group': u'Extra', 'name': u'Trailer hitch'},
{'group_priority': 4, 'group': u'Security', 'name': u'Xenon headlights'}]
And I have passed it (options
) to the template as follows car['options_grouped'] = options
And then in the template I did as follows:
{% regroup car.options_grouped by group as groups %}
{% for group in groups %}
<div>{{ group.grouper }}</div>
{% for option in group.list %}
<div> {{ option.name }}</div>
{% endfor %}
{% endfor %}
Upvotes: 2
Reputation: 1273
If you want an orderedDict with dicts grouped by group
and ordered by group_priority
this should work:
#grouping in Dict with group as key and list of dict as value:
grouped_dict={}
for option in options:
if option['group'] in grouped_dict.keys():
grouped_dict[option['group']].append(option)
else:
grouped_dict[option['group']] = [option]
#sorting by group_priority
ordered = OrderedDict(sorted(grouped_dict.items(), key=lambda t:t[1][0].get('group_priority')))
print(ordered)
Upvotes: 1