簡體   English   中英

django模板:在字典和元素中渲染字典

[英]django template: Render dictionary within dictionary and elements

使用視圖,我生成了以下字典結構:

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

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

更改

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

通過

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

您應該在模板中使用鍵“ 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

在以上答案的幫助下,我設法找到了該問題的解決方案:

第一個解決方法是:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM