使用get_queryset的Django ListView分页

Joh*_*hnJ 5 django django-templates django-models django-views

我一直在尝试学习和掌握Django中分页的ListViews,但是在理解概念时似乎有些麻烦。所以,让我显示一些代码-我的view.py看起来像这样:

class SearchDisplayListView(ListView):
    model = BlogPosts
    template_name = "searchres_list.html"
    paginate_by = '15'
    context_object_name = "searchres"

    def get_context_data(self, **kwargs):
        context = super(SearchDisplayListView, self).get_context_data(**kwargs)
        q = self.request.GET.get('q')
        q = q.replace(" ","+")
        context['searchq'] = q
        return context

    def get_queryset(self):
        queryset = super(SearchDisplayListView, self).get_queryset()
        # Get the q GET parameter
        q = self.request.GET.get('q')
        q = q.replace(" ","+")
        if q is None:
        # Return the base queryset
        return queryset
        # Return a filtered queryset
       ## do some awesome calculations using "q" i.e send request to search server
       ## get back a list from the search server.. example: range(0,100)
        queryset = range(0,100)
        return queryset
Run Code Online (Sandbox Code Playgroud)

如您所见,我实际上并没有使用模型填充查询集-而是从我自己的“搜索服务器”填充查询集,该结果返回了我的结果-在此示例中,范围为(0,100)。

现在,我尝试在模板代码中使用以下内容:

<table class="table table-hover">
<tbody>
{% for i in searchres %}
<tr>
<td><img src="http://placehold.it/140x140" class="img-polaroid"></td>
<td>{{i}}</td>
</tr>
{% endfor %}
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

我的分页如下:

{% if is_paginated %}
<div class="pagination pagination-centered">
    <ul>
        {% if page_obj.has_previous %}
<li><a href="/search/?q={{searchq}}/page={{ page_obj.previous_page_number }}">Prev</a></li>
        {% endif %}

        {% for i in paginator.page_range %}
            {% if page_obj.has_next %}
<li><a href="/search/?q={{searchq}}/page={{ page_obj.number }}">{{i}}</a></li>
            {% endif %}
        {% endfor %}

        {% if page_obj.has_next %}
<li><a href="/search/?q={{searchq}}/page={{ page_obj.next_page_number }}">Next</a></li>
        {% endif %}

    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

现在,我遇到以下问题:

[1]尽管模板似乎分页了第一组(即0到14),但我在随后的页面中看不到其他值。因此,当我单击下一页时,我得到:

 - http://mydata:8000/search/?q=myquery/page=2
Run Code Online (Sandbox Code Playgroud)

当我再次单击下一页时,我得到:

 - http://mydata:8000/search/?q=boots/page=2/page=2
Run Code Online (Sandbox Code Playgroud)

这显然是错误的。我看不到如何生成:

 - http://mydata:8000/search/?q=boots/page=3
Run Code Online (Sandbox Code Playgroud)

[2]即使我手动设置:

 - http://mydata:8000/search/?q=boots/page=3
Run Code Online (Sandbox Code Playgroud)

我再次看到从0到14的值,而不是第3页中的逻辑设置。

另外,这基本上告诉我,在每个页面上,get_queryset似乎都在运行,生成了前0到14个值-这不是我想要的。

如您所见,我在get_queryset中拥有自己的自定义数据集-而不是任何数据库交互-因此,我不确定如何对这些自定义数据进行分页。

感谢您花时间阅读我的长篇文章!

alm*_*lki 5

查询参数必须以&分隔/

/search/?q={{searchq}}/page={{ page_obj.previous_page_number }}
Run Code Online (Sandbox Code Playgroud)

应该:

/search/?q={{searchq}}&page={{ page_obj.previous_page_number }}
Run Code Online (Sandbox Code Playgroud)

另外,最佳做法是使用URL解析器,而不是对URL进行硬编码,例如:

{% url 'search' searchq page_obj.previous_page_number %}
Run Code Online (Sandbox Code Playgroud)