在django中,使用分页创建

时间:2019-04-16 16:00:23

标签: django python-3.x

我一直在尝试获取模型对象列表,将它们的顺序随机化并在模板中进行分页。我以为我已经做到了,直到意识到在下一个页面调用中我一直在对对象进行重新随机化而不是使用先前的随机列表。

无论如何,我只能在第一次打开页面时才对对象列表进行随机化,然后使用相同的列表而在进入下一页时却不对它进行随机化吗?

谢谢。

Views.py

class index(View):
    def get(self, request):
        all_items = list(Electronics.objects.all())
        random.shuffle(all_items)

        paginator = Paginator(items, 24)
        page = request.GET.get('page')
        items = paginator.get_page(page)    

        return render(request, 'home.html', {'items':items, 'header':'Homepage'})

home.html

<div class='container'>
<div class='row'>
{% for item in items %}
        <div class='col-xs-6 col-sm-8 col-lg-4'>
            <img src='{{ item.image.url|cut:"%22"|thumb}}'>
            <h4>{{item.name}}</h4>
            <p>$ {{item.price}}</p>
            <form method='get'>
                <input value='Add to cart' type='submit' formaction= "{% url 'addtocart' item.id %}">
                <input value='View Details' type='submit' formaction= "{% url 'detail' item.id %}">
            </form> 
        <div><br><br>
    {% endfor %}
    </div>
    </div>  

    <div class='pagination' align='center'>
        <span class='step-links'>
            {% if items.has_previous %}
                <a href="?page=1{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">&laquo; first</a>
                <a href="?page={{items.previous_page_number}}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">previous</a>
            {% endif %}
            <span class="current">
                Page {{items.number}} of {{items.paginator.num_pages}}
            </span>
            {% if items.has_next %}
                <a href="?page={{items.next_page_number}}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">next</a>
                <a href="?page={{items.paginator.num_pages}}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">last &raquo;</a>
            {% endif %}
        </span>
    </div>

1 个答案:

答案 0 :(得分:0)

您可以使用this great snippet来实现随机种子查询集混合。基本上,这将使您能够使用mixin(通过诸如/electronics?page=1的url)向视图创建GET请求,然后生成seed并将其缓存在{{1}中},然后重新使用以提取迭代记录集。

这应该不会对您造成太大的负担,因为缓存session很便宜-使用seed可能会很昂贵,但是要记录3-4千条记录就不会了没想到这么大的任务。