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

2024-10-01 22:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个元组解析为一个模板,但在模板中的元组循环中遇到了问题。我只得到空值。我想这样做是为了使用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 %}

Tags: in模板forrequesttagspageprodpaginator
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 %}

对dict调用tuple只返回一个键的元组。我不太清楚你为什么要这样做,但删除该行可能会工作。你知道吗

相关问题 更多 >

    热门问题