如何遍历模板中的多维列表/字典

时间:2019-05-19 18:33:03

标签: python django templates iteration

我尝试重建此示例: https://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/

我有一个模型“产品”和一个模型“订单”。订单具有“产品”的外键。因此,对于1个产品,我有N个订单

在我的模板中,我必须显示很多信息,因此我想避免在我的模板中执行“用于Product.order_set.all()中的订单”

在我的模板中,如果我写:

{{ object_list.1.related_items }}

一切都很好,我得到了我想要的 但是如果我写:

{% for i in object_list %}
    {{ object_list.i.related_items }}
{% endfor %}

我没有结果。

有人可以告诉我如何解决这个问题吗?

我的object_list与上面的示例几乎相同:

products = Product.objects.all()
i = 0
qs = Product.objects.all()
obj_dict = dict([(obj.id, obj) for obj in qs])
objects = Order.objects.filter(producttyp__in=qs)
relation_dict = {}
for obj in objects:
   relation_dict.setdefault(obj.producttyp_id, []).append(obj)
for id, related_items in relation_dict.items():
    obj_dict[id].related_items = related_items
def get(self,request,*args,**kwargs):
    context = {'object_list':self.obj_dict}
    return render(request,self.template_name,context)

我所做的唯一更改是来自 obj_dict [id] ._ related_items到obj_dict [id] .related_items是因为不允许使用下划线?!

如何在模板中打印列表,如:

- Product A
    - Order 1
    - Order 2
    - Order 5
- Product B
    - Order 3
    - Order 6

最好的问候

1 个答案:

答案 0 :(得分:0)

这是合乎逻辑的,因为Django在这里不将i解释为变量,而是将其解释为标识符,因此它旨在访问object_list.iobject_list['i'],而不是{{1} }。

但是,您在这里不需要object_list.1,只需访问i中的related_items,例如:

object

如果顾名思义,{% for object in object_list %} {{ object.related_items }} {% endfor %}也是一个集合,我们也可以迭代这些项目:

related_items

对于字典,我们可以访问{% for object in object_list %} {% for subitem in object.related_items %} {{ subitem }} {% endfor %} {% endfor %},例如:

.values

编辑:针对列表视图的具体情况。您可以使用.prefetch_related通过一个额外的查询来获取所有关系:

{% for object in object_dict.values %}
    {{ object.related_items }}
{% endfor %}

然后您可以在模板中将其呈现为:

class MyListView(ListView):
    queryset = Product.objects.prefetch_related('order_set')
    template = 'my_template.html'