2014-04-01 3 views
0

Используя представление я генерироваться следующим словарным составом:Джанго: Визуализация словаря в пределах словаря и элементы

{'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

Thats, потому что вы не предоставляете какую-либо переменную под названием data.

изменение

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

по

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

Я получил эту ошибку: «builtin_function_or_method» объект не Iterable –

+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 Этот ответ был совместным усилием, поэтому не уверен, что я должен отметить это как ответ. Я просто оставлю это. :) –

Смежные вопросы