我在数据库中的数据格式如下:
collection_name|manufacturer|product_type|description|image_url
----------------------------------------------------------------
Testing |FakeCo |Bed |pretty nice|/img/1.jpg
Testing |FakeCo |Desk |pretty bad |/img/2.jpg
Testing |FakeCo |Nightstand |pretty ok |/img/1.jpg
Testing |FakeCo |Draws |pretty nice|/img/3.jpg
最初,我使用的是for循环来显示每个结果的字段,最终结果是这样的:。
对于上面的示例数据集,我想做的是仅显示某些字段的第一个结果,知道它们对于返回的所有行都是相同的,然后对于其余字段仅在它们不同时才显示它们。
我尝试在django视图中使用集合,因为另一个答案表明这将消除重复并解决我的问题。
我的django视图:
def collection_detail(request, name=None):
template = loader.get_template('/webapps/my_webapp/furniture_site/main_page/templates/main_page/product-detail.html')
products = product.objects.filter(collection_name=name)
collection_name = []
manufacturer = []
description = []
image_url = []
for product in products:
collection_name.append(product.collection_name)
manufacturer.append(product.manufacturer)
description.append(product.description)
image_url.append(product.image_url)
collection_name = set(collection_name)
manufacturer = set(manufacturer)
description = set(description)
image_url = set(image_url)
context={'products': products}
return HttpResponse(template.render(context))
我的问题是,我无法在模板中引用这些设置项。
例如,在我的模板中使用:
{% for instance in products %}
{{ instance.collection_name }} Collection <br />
{% endfor %}
不返回任何内容,
{% for instance in products %}
{{ collection_name }} Collection <br />
{% endfor %}
引用模板中视图返回的项目的正确方法是什么?
最终,我正在尝试获得类似以下的结果(请注意,描述和集合名称仅使用一次,并且未返回重复的图像网址)。
答案 0 :(得分:3)
首先,您没有将正确的数据传递给模板。
您需要在上下文中传递collection_name
,manufacturer
,description
和image_url
。
context = {
'products': products,
'collection_name': collection_name,
'manufacturer': manufacturer,
'description': description,
'image_url': image_url
}
现在,您可以在模板中访问这些内容,如:
{% for instance in collection_name %}
{{ instance }} Collection <br />
{% endfor %}
与其他人相同。
答案 1 :(得分:1)
它应该在循环中仅渲染一个对象。您仍然可以在插值中使用 first 。
赞:
{{ instance.collection_name|first }}
编辑
您需要将collection_name
初始化为空列表,因此它是一个变量,只有在context
中传递它时才可以使用。
context={'products': products, 'collection_name': collection_name}