在模板内循环通过元组返回空值

时间:2014-02-19 16:58:57

标签: python django django-templates

我正在尝试将元组解析为模板,但是我在循环中通过模板中的元组得到问题。我只是得到空值。我想这样做是为了使用django分页,这需要一个可以循环的对象。

这是我创建元组的视图

def home(request):
    if request.user.is_authenticated():
        print "login"
        user = request.user
        prods = Product.objects.all()

        i = 0
        print 'numero de produtos ' + str(len(prods))
        prodmatrix = {}
        for prod in prods:
            #                       0             1           2    3
            prodmatrix[str(i)] = [[prod.name], [prod.image], [], [prod.slug]] 
            reviews = Review.objects.filter(product=prod.id) #   ^ this is for tags
            print str(len(reviews))
            if len(reviews) != 0: 
                for review in reviews:
                    rev_alltags = review.tag.all()
                    for tags in rev_alltags[:3]:     #                           
                        print tags.name
                        prodmatrix[str(i)][2].append(tags.name) # append only tags 
            print str(i)
            i = i + 1
        #prodmatrix = tuple(prodmatrix)
        paginator = Paginator(prodmatrix.items(), 2)
        page = request.GET.get('page')
        try:
            prodmatrix = paginator.page(page)
        except PageNotAnInteger:
            prodmatrix = paginator.page(1)
        except EmptyPage:
            prodmatrix = paginator.page(paginator.num_page)
        return render(request, 'home.html',{'prodmatrix':prodmatrix})

这就是我试图循环思考模板中的元组:

 {% for keys, values in prodmatrix %}
<li class="span3">
                                                    <div class="product-box">
{{ values.0.0 }} {{ values.0.3 }} {{ values.1.1 }} {{ values.1.2 }}
</div>
</li>
{% endfor %}

2 个答案:

答案 0 :(得分:2)

在dict上调用tuple只会返回键的元组。我不太确定你为什么这样做,但删除那一行可能会有效。

答案 1 :(得分:2)

不要费心将dict转换为元组。调用dict上的items方法,以获得可以以这种方式迭代的内容:

{% for keys, values in prodmatrix.items %}
  <li class="span3">
    <div class="product-box">
      {{ values.0.0 }} {{ values.0.3 }} {{ values.1.1 }} {{ values.1.2 }}
    </div>
  </li>
{% endfor %}

顺便说一下,做这样的事情可能更简单:

class Product(models.Model):
    # ...
    @property
    def tags(self):
        return self.review_set.values_list('tag_set__name', flat=True).distinct()


def home(request):
    if request.user.is_authenticated():
        products = Product.objects.prefetch_related('review_set__tag_set')
        return render(request, 'home.html', {
            'products': products,
        })

然后你的模板看起来像这样:

{% for product in products %}
  <li class="span3">
    <img src="{{ product.image.image.url }}"/>
    <div class="product-box">
      {{ product.name }} -
      {{ product.tags|join:', ' }} -
      {{ product.slug }}
    </div>
  </li>
{% endfor %}