遍历Django模板中的对象

时间:2016-07-10 03:23:25

标签: django

在Django 1.9中,我有一个包含汽车品牌的数据库表。我正试图建立一个汽车品牌的索引(就像教科书后面的一个索引)。例如:

A
阿斯顿马丁
奥迪
...

宾利
BMW
...

以下是我的 view.py

中的代码
def home(request):

    car_index = {}
    alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N',
        'O','P','Q','R','S','T','U','V','W','X','Y','Z']

    for letter in alphabet:
        car_index[letter] = {}
        car_index[letter]['title'] = letter
        car_index[letter]['brands'] = Cars.objects.filter(brand__startswith = letter)

    return render(request, 'cars/home.html', {'car_index':car_index})

以下是我的 home.html 模板中的代码:

{% for each in car_index %}

    {{ each.title }}

    {% for brand in each.brands %}
        <a href="{{ brand.link }}">{{ brand.name }}</a><br>
    {% endfor %}

{% endfor %}

在view.py中,我在模板上下文中的查询集.values()中尝试了.items()。在模板中,我尝试了car_index.itemseach.brands.itemseach.brands[0]。什么都行不通。使用上面的代码,我得到标题:E D X I A U H B T S N K Q Z Y W V O L R F G P C M,但没有链接。 (我知道如何排序,但首先处理链接)

我读过:

https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#for

how to iterate through dictionary in a dictionary in django template?

3 个答案:

答案 0 :(得分:3)

更好的方法 - 更清洁的代码,除了数据库效率:

alphabet = ['A','B','C','D','E','F','G', ..]

brands_list = []
for letter in alphabet:
    letter_ = {'cars': Cars.objects.filter(brand__startswith=letter), 'letter': letter}
    brands_list.append(letter_)

return render(request, 'cars/home.html', {'brands': brands_list})

模板

{% for brand in brands %}    
    {{ brand.letter }}    
    {% for car in brand.cars %}
        <a href="{{ car.link }}">{{ car.name }}</a><br>
    {% endfor %}
{% endfor %}

答案 1 :(得分:2)

我可以阻止你摆脱目前的做法吗?

您正在以26个步骤进行全表扫描。如果品牌列不是唯一的,您会发现名称会重复出现。如果你有数百万条记录,你将耗尽内存。如果品牌列没有索引,您会发现以下查询非常慢:

Cars.objects.filter(brand__startswith = letter)

有一个非常简单的解决方案。这也可能涉及全表扫描,但至少你执行一个慢查询而不是26。

Cars.objects.raw('SELECT max(id), SubStr(brand,1,1) AS letter, brand
    FROM myapp_cars GROUP BY substr(brand,1,1)')

这是使用原始查询。如果你不喜欢它们并碰巧幸运地使用Postgresql,你可以使用distinct来更客观地实现同样目标。

答案 2 :(得分:1)

我很高兴我的评论帮助你以某种方式解决了你的问题。 我只是将它作为答案发布,以便它可以帮助其他人。

{% for each in car_index %},只是迭代掉当前的 dict 并且不解包 dicts dict ,这是品牌< EM>字典

由于car_index上下文包含字典,以下内容将显示car_index字典的键和值,并解开品牌字典。

{% for key,value in car_index.items %}

    {{ value.title }}

    {% for brand in value.brands %}
        <a href="{{ brand.link }}">{{ brand.name }}</a><br>
    {% endfor %}

{% endfor %}