如何将排序列表(字典列表)传递给Django 1.6模板

时间:2017-03-02 21:01:24

标签: python django sorting django-templates

我有一个方法需要显示我以排序方式从模型创建的一些数据。我试图将有序集传递给模板。这是方法:

def club_team_results(request, team_id):
    """Display detailed information for a specific team, including a list of results by event."""
    team = Team.objects.get(pk=team_id)
    team_events_list = EventDivisionTeam.objects.filter(team=team.id).order_by('division__start_date')
    results={}
    # Each match result is listed once, this team can be either of team or opposing_team
    for r in Result.objects.filter(team=team):
        results[r.id] = {'opponent': r.opposing_team.name,
                         'outcome': r.outcome,
                         'scores': r.scores,
                         'phase': r.phase,
                         'match': r.match,
                         'event_division_id': r.division.id,
                        }
    for r in Result.objects.filter(opposing_team=team):
        results[r.id] = {'opponent': r.team.name,
                         'outcome': r.outcome,
                         'scores': r.scores,
                         'phase': r.phase,
                         'match': r.match,
                         'event_division_id': r.division.id,
                         }

    context = {'team_events_list': team_events_list, 'team_results': results, 'team': team, }
    return render(request, 'rank/club_team_results.html', context)

我想传递按主键(r.id)排序的结果对象。我试过更换:

'team_results': results

'team_results': sorted(results.items())
在上下文赋值中

,但在尝试对其进行排序时,没有数据传递给模板。请注意,此时我无法升级Django版本(今年夏天我会这样做),因此我坚持使用1.6(目前使用的是Python 3.3和Django 1.6)。任何帮助将不胜感激!

以下是显示结果列表的模板部分:

{% for usav_code, result in team_results.items %}
    {% if result.event_division_id == event.division.id %}
        <tr>
            <td colspan="2">&nbsp;</td>
            <td class="alignleft">{{ result.phase }}</td>
            <td class="alignleft">{{ result.match }}</td>
            <td class="alignleft">{{ result.opponent }}</td>
            <td class="alignleft">{{ result.outcome }}</td>
            <td class="alignleft">{{ result.scores }}</td>
        </tr>
    {% endif %}
{% empty %}
    <tr>
        <td colspan="2">&nbsp;</td>
        <td colspan="5">No results to display.</td>
    </tr>
{% endfor %}

如果我在上下文赋值语句中对结果使用sorted()方法,则模板中的结果列表会点击空标记并显示&#34;无结果显示。&#34;

2 个答案:

答案 0 :(得分:0)

您的意思是什么意思没有数据通过sorted(results.items())传递给模板?如果您可以获得元组列表而不是字典,那么这应该可行。具体来说,您可能需要sorted(results.items(), key=lambda x:x[0])才能按键排序。

如果你想最终获得一个词典,也许你可以使用OrderedDict

然后执行OrderedDict(sorted(results.items(), key=lambda x:x[0]))将返回已排序的字典。

答案 1 :(得分:0)

sorted(results.items())的结果不再是dict,而是list的{​​{1}} - 但您仍在尝试拨打tuples它在模板中。

变化:

.items()

为:

{% for usav_code, result in team_results.items %}

它将正确迭代元组列表。

默认情况下,Django会隐藏模板中的任何{% for usav_code, result in team_results %} 并且不返回任何内容,因此对不存在的AttributeError方法的调用导致for循环为空。