Django - 在模板中打印字典

Posted

技术标签:

【中文标题】Django - 在模板中打印字典【英文标题】:Django - Print dict in template 【发布时间】:2017-08-19 04:53:27 【问题描述】:

我有一个字典 my_var 定义为:

defaultdict(<class 'collections.Counter'>,
    'product1': Counter('total_qty': 1),
    'product2': Counter('total_qty': 13),
    'product3': Counter('total_qty': 65)
)

我将它传递给模板:

context = 'my_var': my_var
return render(request, 'my_template.html', context)

在模板中,我尝试在没有任何运气的情况下打印它:

<ul>
    % for k in my_var %
        <li> k.component :  k.total_qty </li>
    % endfor %
</ul>

我没有得到任何错误,但我没有得到键和值;我做错了什么?

我得到类似的东西:

: : :

编辑:

为了添加一些上下文,我最初有一个字典列表:

used_components = ['total_qty': 5, 'component': 'component blue',...]

然后我使用这个函数按键对字典进行分组和求和:

def solve(dataset, group_by_key, sum_value_keys):
    dic = defaultdict(Counter)
    for item in dataset:
        key = item[group_by_key]
        vals = k: item[k] for k in sum_value_keys
        dic[key].update(vals)
    return dic

my_var = solve(used_components, 'component', ['total_qty'])

然后我尝试在模板中打印my_var,如上所述。

编辑2:

这是我的实际views.py:

def solve(dataset, group_by_key, sum_value_keys):
    dic = defaultdict(Counter)
    for item in dataset:
        key = item[group_by_key]
        vals = k: item[k] for k in sum_value_keys
        dic[key].update(vals)
    return dic

def components_by_season(request, season_name):
    season = get_object_or_404(Season, name=season_name)

    orderitems = OrderItem.objects.filter(order__season__name=season_name)

    # variant_ids = OrderItem.objects.filter(order__season__name=season_name).values_list('variant_id', flat=True)
    # components = Component.objects.filter(bom__variant__id__in=variant_ids)

    used_components = []

    for item in orderitems:
        variant_ordered_qty = item.qty
        components = Component.objects.filter(boms__variant__id__exact=item.variant.id)
        for component in components:
            bom_qty = component.boms.get(component=component).qty
            total_qty = bom_qty * variant_ordered_qty
            used_components.append(
                'component': component.name.encode('ascii', 'ignore'),
                'total_qty': total_qty
            )

    out = solve(used_components, 'component', ['total_qty'])

    # counter = Counter(used_components)

    context = 'season': season, 'orderitems': orderitems, 'used_components': used_components, 'out': out
    return render(request, 'components_by_season.html', context)

【问题讨论】:

是否已将 defaultdict 分配给 my_dict? 是的,实际上,my_dict 是一个字典列表;我更新了我的 Q 该代码表明它是一个字典的字典。是哪个? 好吧,老实说,我对此有点迷茫:/ 【参考方案1】:

假设这实际上是您的真实代码,my_var 是一个字典,而不是一个列表。遍历 dict 只会给你钥匙;如果你也想要这些值,你应该遍历.items()。所以:

<ul>
    % for k, v in my_var.items %
        <li> k :  v.total_qty </li>
    % endfor %
</ul>

还要注意,没有product 键;产品名称只是外部字典中的键。

【讨论】:

嗨,这是我的真实代码,只是为了概括一下,改了一些变量名;现在我在 Q 中添加了一些上下文。我尝试了你的代码,但它没有在页面上打印任何内容 这并没有真正帮助。你能在视图的上下文中显示这个吗?【参考方案2】:

最后我通过将out.items() 传递给模板并迭代out 使其工作,所以:

views.py

context = 'out': out.items()
return render(request, 'components_by_season.html', context)

在我的模板中:

% for k,v in out %
    <p> k :  v.total_qty </p>
% endfor %

【讨论】:

以上是关于Django - 在模板中打印字典的主要内容,如果未能解决你的问题,请参考以下文章

在模板 django 中打印(未排序的)字典

Django Python,通过字典并将其内容打印在html模板中

Django 字典对象在模板中不显示任何内容,但打印到控制台

在django模板的一本字典里面的字典

如何访问 Django 模板中的字典元素?

如何访问 Django 模板中的字典元素?