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