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中拥有自己的自定义数据集-而不是任何数据库交互-因此,我不确定如何对这些自定义数据进行分页。
感谢您花时间阅读我的长篇文章!
查询参数必须以&分隔/
/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)
| 归档时间: |
|
| 查看次数: |
13363 次 |
| 最近记录: |