2017-03-02 70 views
0

我有一种方法需要显示一些数据,这些数据是以已排序方式从模型中创建的。我正在尝试将有序集合传递给模板。这里的方法:如何将已排序的列表(字典列表)传递给Django 1.6模板

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 %} 

如果我使用排序()方法在上下文赋值语句的结果,然后在模板结果列表打空标签并显示“无结果显示”。

回答

0

sorted(results.items())结果不再是dict,它是一个tupleslist - 但你还是想在模板调用.items()就可以了。

变化:

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

到:

{% for usav_code, result in team_results %} 

,它会在元组列表中正确循环。

默认情况下,Django隐藏您在模板中获得的任何AttributeError,并且不返回任何内容,因此对不存在的.items()方法的调用导致空的for循环。

0

你是什么意思没有数据传递到与sorted(results.items())模板?如果你可以得到一个元组列表而不是字典,那么它应该可以工作。具体而言,您可能需要sorted(results.items(), key=lambda x:x[0])以按键排序。

如果你想在最后得到一个字典,也许你可以使用OrderedDict

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

+0

使用sorted()时,包括添加key = lambda x:x [0]的示例,我打开列表的{%for%}迭代器上的{%empty%}标记。如果我没有排序(),那么列表显示正确,但未排序。我会看看是否可以在原始帖子的代码段中添加模板的相应部分。 –

+0

我刚刚在Django 1.10文档中看到1.10增加了sorted()在“列表清单”上的工作能力。这可能与我遇到的问题有关吗?我是Django 1.6 ... –