如何使用for循环在Django模板(index.html)中解析字典列表的元素

时间:2018-08-09 07:36:53

标签: django django-models django-templates django-views

models.py

class Data(models.Model):
    price = models.CharField(max_length=264,unique=False,blank=True,null=True)
    shipping = models.CharField(max_length=264,unique=False,blank=True,null=True)
    netprice = models.CharField(max_length=264,unique=False,blank=True,null=True)
    points = models.CharField(max_length=264,unique=False,blank=True,null=True)

    def __str__(self):
        return str(self.price)

views.py

def index(request):
  az_list=list(Data.objects.all())
  return render(request,{'az_list':az_list,'loop':range(500)})

index.html

{% for i in loop %}
  {{ az_list.i.price}}
  {{ az_list.i.shipping}}
  {{ az_list.i.netprice}}
  {{ az_list.i.points}}
{% endfor %}

1 个答案:

答案 0 :(得分:1)

在Django模板中,如果没有模板过滤器或模板标记,就无法轻松获取列表的第 i 个元素。此外,这是糟糕的设计。遍历列表的Python方式是遍历列表。您可以这样写:

{% for element in az_list %}
  {{ element.price}}
  {{ element.shipping}}
  {{ element.netprice}}
  {{ element.points}}
{% endfor %}

如果您想限制要渲染的元素数量,可以通过在查询中设置一个限制来实现,例如:

def index(request):
  az_list = Data.objects.all()[:500]
  return render(request, 'template.html', {'az_list': az_list})

这还将提高性能,因为现在您最多只能从数据库中获取500条记录,而不是首先获取 all 条记录,然后仅呈现前500条记录。

编辑:如果要同时迭代多个可迭代对象,则可以使用zip(..)。例如:

def index(request):
    ax_list = Model1.objects.all()
    ay_list = Model2.objects.all()
    az_list = Model3.objects.all()
    return render(
        request,
        'template.html',
        {'all_data': zip(ax_list, az_list)}
    )

然后我们可以遍历以下元素:

{% for axi, ayi, azi in all_data %}
  {{ axi.price}}
  {{ axi.shipping}}
  {{ axi.netprice}}
  {{ axi.points}}
{% endfor %}

此处axiayiazi是三个列表中位于 same 索引处的元素。