2017-03-02 56 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 ... –