DJANGO:按值排序字典(并发送到模板)

时间:2016-12-29 22:59:04

标签: django sorting dictionary

我遇到了以下问题:对于我的webapp,我正在创建一个页面,显示前10位海报用户在我的网站上发布了多少评论。

(格式为Username - Number_of_reviews

信息作为字典传递给模板,由view.py中的以下函数生成:

def hall_of_game(请求):

(....)

review_histogram = {}
most_reviews = {}
for x in Vote.objects.all():
    review_histogram[x.voter] = review_histogram.get(x.voter, 0) + 1
sorted_list = []
for key, value in review_histogram.items():
    sorted_list.append((value, key))
    sorted_list.sort(reverse=True)
return render(request, 'list/hall_of_fame.html', {(....), 'sorted': sorted_list})

然后模板将字典转换为有序列表

<ol>
 {% for v, k in sorted|slice:":10" %}
 <li>{{ k }} - {{ v }}</li>
 {% endfor %}
</ol>

但是,当2个或更多用户具有相同数量的评论时,该功能无法再对列表进行排序并且崩溃,从而引发类型错误。

类型错误   unorderable类型:User()&lt;用户()

我尝试通过将列表排序在'try / except'循环中来解决问题,虽然这可以防止崩溃,但这也会阻止列表排序。

我觉得我忽略了显而易见但是对于我的生活我无法弄清楚如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

给sort调用一个关键函数,告诉它只按元组的第一个元素排序:

for key, value in review_histogram.items():
    sorted_list.append((value, key))
sorted_list.sort(key=lambda x: x[0], reverse=True)

另请注意,调用应该在循环之外,否则您将在每次迭代时不必要地进行排序。