gpt4 book ai didi

使用 get_queryset 的 Django ListView 分页

转载 作者:行者123 更新时间:2023-12-01 23:30:29 25 4
gpt4 key购买 nike

我一直在尝试学习并掌握 Django 中带有分页功能的 ListView,但我在理解概念方面似乎遇到了一些困难。那么,让我展示一些代码 - 我的 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

正如您所看到的,我实际上并没有使用模型填充我的查询集 - 而是从我自己的“搜索服务器”返回结果 - 在此示例中为范围(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>

我的分页如下所示:

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

现在,我遇到了以下问题:

[1] 虽然模板似乎对第一组(即 0 到 14)进行了分页,但我无法在后续页面中看到其他值。因此,当我单击下一页时,我得到:

 - http://mydata:8000/search/?q=myquery/page=2

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

 - http://mydata:8000/search/?q=boots/page=2/page=2

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

 - http://mydata:8000/search/?q=boots/page=3

[2]即使我手动设置:

 - http://mydata:8000/search/?q=boots/page=3

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

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

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

感谢您花时间阅读我相当长的帖子!

最佳答案

查询参数必须用& not/分隔

/search/?q={{searchq}}/page={{ page_obj.previous_page_number }}

应该是:

/search/?q={{searchq}}&page={{ page_obj.previous_page_number }}

此外,最佳实践是使用 URL 解析器,而不是对 URL 进行硬编码,例如:

{% url 'search' searchq page_obj.previous_page_number %}

关于使用 get_queryset 的 Django ListView 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14959629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com