如何从模板引用Django视图中的set对象?

时间:2019-01-03 05:51:36

标签: django django-templates django-views

我在数据库中的数据格式如下:

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循环来显示每个结果的字段,最终结果是这样的:this:

对于上面的示例数据集,我想做的是仅显示某些字段的第一个结果,知道它们对于返回的所有行都是相同的,然后对于其余字段仅在它们不同时才显示它们。

我尝试在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 %}

引用模板中视图返回的项目的正确方法是什么?

最终,我正在尝试获得类似以下的结果(请注意,描述和集合名称仅使用一次,并且未返回重复的图像网址)。

enter image description here

2 个答案:

答案 0 :(得分:3)

首先,您没有将正确的数据传递给模板。

您需要在上下文中传递collection_namemanufacturerdescriptionimage_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}