2014-04-01 98 views
0

使用視圖我已生成以下字典結構:django的模板:渲染字典內的字典和元件

{'badge-bronze': {'badge_recipients': [<User: aa>, <User: ni>], 'badge': 'badge-bronze', 'page_class': 'meta'}, 'badge-silver': {'badge_recipients': [<User: ni>], 'badge': 'badge-silver', 'page_class': 'meta'}, 'badge-gold': {'badge_recipients': [<User: ni>], 'badge': 'badge-gold', 'page_class': 'meta'}} 

這裏是我所產生的字典(只包括我構建字典其中的部分)

def contest(request): 
    all_badges = badge_data.BADGES.keys() 
    data = {} 
    for badge in all_badges: 
     if badge == 'badge-bronze' or badge == 'badge-silver' or badge == 'badge-gold': 
      badge_data_info = get_object_or_404(BadgeData, slug=badge) 
      badge_recipients = User.objects.filter(
           award_user__badge = badge_data_info 
          ).annotate(
           last_awarded_at = Max('award_user__awarded_at'), 
           award_count = Count('award_user') 
          ).order_by(
           '-last_awarded_at' 
          )       
      data[badge] = { 
       'badge_recipients' : badge_recipients, 
       'badge' : badge_data_info, 
       'page_class': 'meta', 
      } 
    #import pdb 
    #pdb.set_trace()  
    return render(request, 'contest.html', {'data':data}) 

在我的模板我試圖使其如下:

<div id="award-list"> 
    {% for key,value in data.items %} 
     <li>key</li> 
     {% for recipient in value.badge_recipients %} 
      <div class="user"> 
        <span class="thumb">{{ gravatar(recipient, 32) }}</span> 
        <span><a href="{{ recipient.get_absolute_url() }}">{{recipient.username|escape}}</a></span> 
        <span>{{ macros.user_score_and_badge_summary(user) }}</span> 
      </div> 
     {% endfor %} 
    {% endfor %} 
</div> 

但我得到錯誤說數據沒有定義,也沒有得到渲染。基於提供的答案,我做了更改,現在我的錯誤如下:'builtin_function_or_method' object is not iterable

回答

1

那是因爲您沒有向模板提供任何名爲data的變量。

變化

return render(request, 'contest.html', data) 

通過

return render(request, 'contest.html', {'data': data}) 
+0

我得到這個錯誤:「builtin_function_or_method」對象不是可迭代 –

+1

您可以編輯您的文章,並顯示現在怎麼看你的代碼? –

+0

只是編輯它。 –

1

你應該在模板中使用的關鍵 'badge_recipients':我設法找出解決方案

<div id="award-list"> 
    {% for key,value in data.items %} 
     <li>key</li> 
     {% for recipient in value.badge_recipients %} 
      <div class="user"> 
        <span class="thumb">{{ gravatar(recipient, 32) }}</span> 
        <span><a href="{{ recipient.get_absolute_url() }}">{{recipient.username|escape}}</a></span> 
        <span>{{ macros.user_score_and_badge_summary(user) }}</span> 
      </div> 
     {% endfor %} 
    {% endfor %} 
</div 
+0

我試了兩個答案,它沒有真正的工作。當我嘗試你的答案時,我得到錯誤說數據是未定義的。 –

+1

米蘭達寫道,你應該將數據傳遞給模板,我忘了它。 –

+0

是否真的我編輯與你們的答案的問題..'builtin_function_or_method'對象是不可迭代的 –

1

隨着上述答案的幫助對於這個問題:

首次定位是:

return render(request, 'contest.html', data)return render(request, 'contest.html', {'data': data})

然後,當你遍歷詞典中,你所要做的dictionary.items()這是從上面的答案唯一缺少的東西。

<div id="award-list"> 
    {% for key,value in draw.items() %} 
     {% for recipient in value.badge_recipients %} 
      <div class="user"> 
        <span class="thumb">{{ gravatar(recipient, 32) }}</span> 
        <span><a href="{{ recipient.get_absolute_url() }}">{{recipient.username|escape}}</a></span> 
        <span>{{ macros.user_score_and_badge_summary(user) }}</span> 
      </div> 
     {% endfor %} 
    {% endfor %} 
</div> 
+1

哇......我們怎麼錯過了? +1爲「鷹眼」 –

+0

@RaydelMiranda這個答案是一個協作努力,所以不知道我是否應該將其標記爲答案。我會保持它的狀態。 :) –