如何解决带分页的 django 过滤器:按下一个 url 后显示相同的页面
当我搜索某物(如汤姆)时,它适用于第一页。但是如果我点击下一页网址,它显示相同的结果,没有任何变化,但在网址中,它变为 http://127.0.0.1:8000/search/?caption=tom 到 http://127.0.0.1:8000/search/?caption=tom&?page=2>
过滤器.py:
class VideoFilter(django_filters.FilterSet):
class Meta:
model = Video
fields = ['caption']
filter_overrides = {
models.CharField: {
'filter_class': django_filters.CharFilter,'extra': lambda f: {
'lookup_expr': 'icontains',},}
views.py:
def search(request):
queryset = Video.objects.all()
filterset = VideoFilter(request.GET,queryset=queryset)
if filterset.is_valid():
queryset = filterset.qs
paginator = Paginator(queryset,2)
page_number = request.GET.get('page')
print(page_number)# always prints **none**
queryset = paginator.get_page(page_number)
return render(request,'search.html',{
'result': queryset,'caption': request.GET['caption'],})
search.html:
{% extends 'navbar.html' %}
{% block body %}
<!-- more code -->
{% if result.has_next %}
<a href="?caption={{caption}}&?page={{result.next_page_number}}"><button>See more results</button></a>
{% endif %}
{% endblock body %}
navbar.html:
<!-- more code -->
<form action="/search/" method="GET"> <!-- working without csrf_token -->
<input type="text" placeholder="Search" id="search" name="caption" required />
<button type="submit">Search</button>
</form>
问题出在哪里? 我如何访问下一页?
解决方法
您在按钮的 URL 中犯了错误,query string [wiki] 中的键值对由 &符号 (&
) 分隔,而不是&符号与问号 ()。通过这样写,Django 会将其解释为:&?
>>> QueryDict('caption=tom&?page=2')
<QueryDict: {'caption': ['tom'],'?page': ['2']}>
所以参数不是,而是page
?page
。
我们可以通过删除 URL 中标题和页面之间的问号来解决此问题:
<a href="?caption={{ caption|urlencode }}&page={{ result.next_page_number }}">
您还应该使用 |urlencode
template filter [Django-doc] 来防止错误的查询字符串,例如当标题带有问号、数字符号 (#
) 等时。|urlencode
过滤器将转换percent encoding [wiki] 中的文本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。