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

Posted

技术标签:

【中文标题】django 模板:在字典和元素中渲染字典【英文标题】:django template: Render dictionary within dictionary and elements 【发布时间】:2014-05-12 18:56:49 【问题描述】:

使用视图我生成了以下字典结构:

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

【讨论】:

我收到这个错误:'builtin_function_or_method' 对象不可迭代 您可以编辑您的帖子并显示您的代码现在的外观吗? badges_recipients 中的某些可能是None 不正确,因为如果徽章存在,我正在填充字典......基于 if 条件......但我刚刚更新了问题...... 显然你没有得到你所期望的badge_recipients。你调试过代码吗?【参考方案2】:

您应该在模板中使用密钥“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

【讨论】:

我尝试了两个答案,但它并没有真正起作用。当我尝试您的答案时,我收到错误消息说数据未定义。 你应该像 Miranda 写的那样将数据传递给模板,我忘了。 我真的用你们的答案编辑了问题吗..'builtin_function_or_method' 对象不可迭代 展示如何在视图函数中生成 badge_recipients 变量 在这种情况下,您应该使用 % for recipient in value.badge_recipients.all %【参考方案3】:

在上述答案的帮助下,我设法找出了这个问题的解决方案:

第一个修复是:

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 @RaydelMiranda 这个答案是一个协作的努力,所以我不确定我是否应该将此标记为答案。我会保持原样。 :)

以上是关于django 模板:在字典和元素中渲染字典的主要内容,如果未能解决你的问题,请参考以下文章

在Django模板中渲染有序反转字典值

django 第四天模板渲染

Django 模板渲染

Django 渲染 dict 性能

如何使用 Django 变量设置 HTML 元素的宽度?

Django 模板变量和 Javascript