分页不接受 dict 作为数据 - 不可散列的类型 [英] Pagination doesn't accept dict as data - unhashable type

查看:15
本文介绍了分页不接受 dict 作为数据 - 不可散列的类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Django 分页 分页文档.但我收到此错误:

TypeError at/不可哈希类型

这基本上是因为我使用字典作为对象而不是查询集.我想知道是否有办法将我的字典变成可散列对象.

这是我在模板中的字典:

{% for key, values in prodmatrix.items %} 
  • <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>
  • {% 结束为 %}

    这是我的观点:

    def home(请求):如果 request.user.is_authenticated():打印登录"用户 = request.userprods = Product.objects.all()我 = 0打印 'numero de produtos' + str(len(prods))前矩阵 = {}对于 prod 中的 prod:# 0 1 2 3prodmatrix[str(i)] = [[prod.name], [prod.image], [], [prod.slug]]评论 = Review.objects.filter(product=prod.id) # ^ 这是标签打印 str(len(评论))如果 len(评论) != 0:在评论中查看:rev_alltags = review.tag.all()对于 rev_alltags[:3] 中的标签:#打印标签.nameprodmatrix[str(i)][2].append(tags.name) # 只附加标签打印 str(i)我 = 我 + 1paginator = Paginator(prodmatrix, 2)page = request.GET.get('page')尝试:prodmatrix2 = paginator.page(page)除了 PageNotAnInteger:prodmatrix2 = paginator.page(1)除了 EmptyPage:prodmatrix2 = paginator.page(paginator.num_page)返回渲染(请求,'home.html',{'prodmatrix2':prodmatrix})

    解决方案

    使用tuple代替dict,像这样:

    # 将 `dict` 转换为 `tuple`:prodmatrix = 元组(prodmatrix)paginator = Paginator(prodmatrix, 2)# 或这个paginator = Paginator(prodmatrix.items(), 2)page = request.GET.get('page')尝试:prodmatrix2 = paginator.page(page)除了 PageNotAnInteger:prodmatrix2 = paginator.page(1)除了 EmptyPage:prodmatrix2 = paginator.page(paginator.num_page)返回渲染(请求,'home.html',{'prodmatrix2':prodmatrix})

    在你的模板中,你需要通过元组的索引 (key=0, value=1) 调用 attrs 和方法

    I'm trying to use Django pagination Pagination Docs. But I'm receiving this error:

    TypeError at /
    unhashable type
    

    Which is basically because I'm using a dictionary as my object and not a queryset. I would like to know if there is a way to turn my dictionary a hashable object.

    This is my dict in template:

    {% 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 %}
    

    This is my view:

    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})
    

    解决方案

    Use tuple instead dict, like this:

    # 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})
    

    And in you template, you need call the attrs and method by index of tuple (key=0, value=1)

    这篇关于分页不接受 dict 作为数据 - 不可散列的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆