2014-02-19 40 views
2

我試圖使用Django分頁Pagination Docs。但我收到此錯誤:分頁不接受字典作爲數據 - 不可干擾類型

TypeError at/
unhashable type 

這基本上是因爲我使用字典作爲我的對象而不是查詢集。 我想知道是否有辦法將我的字典變成可排列的對象。

這是我的字典中的模板:

{% for key, values in prodmatrix.items %}                          <li class="span3"> 
<div class="product-box"> 
<span class="sale_tag"></span> 
<p><a href="{% url 'product_detail' slug=values.3.0 %}"><img src="{{ STATIC_URL }}{{values.1.0}}" alt="" /></a></p> 
    <a href="{% url 'product_detail' slug=values.3.0 %}" class="title"><h4>{{ values.0.0 }}</h4></a><br/> 
    <p class="category"><a href="{% url 'product_detail' slug=values.3.0 %}">{{values.2.}} {{values.2.1}} {{values.2.2}}</a></p> 
</div> 
</li> 
{% endfor %} 

這是我的看法:

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 
     paginator = Paginator(prodmatrix, 2) 
     page = request.GET.get('page') 
     try: 
      prodmatrix2 = paginator.page(page) 
     except PageNotAnInteger: 
      prodmatrix2 = paginator.page(1) 
     except EmptyPage: 
      prodmatrix2 = paginator.page(paginator.num_page) 
     return render(request, 'home.html',{'prodmatrix2':prodmatrix}) 

回答

2

使用tuple代替dict,像這樣:

# convert `dict` to `tuple`: 
prodmatrix = tuple(prodmatrix) 
paginator = Paginator(prodmatrix, 2) 
# or this 
paginator = Paginator(prodmatrix.items(), 2) 

page = request.GET.get('page') 
try: 
    prodmatrix2 = paginator.page(page) 
except PageNotAnInteger: 
    prodmatrix2 = paginator.page(1) 
except EmptyPage: 
    prodmatrix2 = paginator.page(paginator.num_page) 
return render(request, 'home.html',{'prodmatrix2':prodmatrix}) 

而且在你模板,你需要通過元組索引來調用attrs和method(key = 0,value = 1)

+0

謝謝!我只是沒有得到如何在模板中更改代碼。我用模板中的字典代碼更新了我的問題。它會如何改變? –

+0

'items()'是'dict'的一種方法,但不是'tuple'。您已經擁有'tuple'中的數據,並且不需要使用'items()'方法 {%for key,prodmatrix%中的值} {{values.0.0}} {{values.1.0}} {{values。 1.1}} {{values.1.2}} {%endfor%} – freylis

+0

謝謝,但元組仍然不起作用。我試圖解析它的值爲0.0,但它返回''作爲結果 –