Skip to main content
 首页 » 编程设计

python之Django 分页查询的下一步和之前链接

2024年08月27日31jackei

我正在尝试为 Django 制作一个搜索表单。

它是一个典型的搜索表单,然后返回一个匹配表。我希望对返回的表格进行分页。

问题出在 Previous 和 Next 按钮上。 返回查询的链接转到 /records/search/?query=a(搜索示例是 a) 该页面输出表格及其上一个和下一个链接。然而,链接重定向到 /records/search/?page=2 并且页面显示空白表格。

关于我应该为 Prev/Next 传递哪些链接的任何帮助?

search.html:

{% extends 'blank.html' %} 
 
{% block content %} 
 
    <div class="row"> 
    <form id="search-form" method="get" action="."> 
      {{ form.as_p }} 
      <input type="submit" value="Search" /> 
    </form> 
    </div> 
    <br><br> 
 
//display table code// 
 
{% if is_paginated %} 
<div class="pagination"> 
    <span class="step-links"> 
        {% if agent_list.has_previous %} 
            <a href="?page={{ agent_list.previous_page_number }}{% for key,value in request.GET.items %}{% ifnotequal key 'page' %}&{{ key }}={{ value }}{% endifnotequal %}{% endfor %}">forrige</a> 
        {% endif %} 
 
        <span class="current"> 
            Page {{ agent_list.number }} of {{ agent_list.paginator.num_pages }}. 
        </span> 
 
        {% if agent_list.has_next %} 
            <a href="?page={{ agent_list.next_page_number }}">Next</a> 
        {% endif %} 
    </span> 
</div> 
{% endif %} 
 
{% endblock %} 

和搜索 View :

def search_page(request): 
    form = SearchForm() 
    agents = [] 
    show_results=False 
 
    if request.GET.has_key('query'): 
        show_results=True 
        query=request.GET['query'].strip() 
        if query: 
            form=SearchForm({'query': query}) 
            agents = \ 
                Agent.objects.filter(Q(name__icontains=query)) 
 
 
    paginator = Paginator(agents, 10) 
    page = request.GET.get('page') 
    try: 
        agents = paginator.page(page) 
    except PageNotAnInteger: 
        agents = paginator.page(1) 
    except EmptyPage: 
        agents = paginator.page(paginator.num_pages) 
 
 
    variables = RequestContext(request,  
        {   'form': form, 
            'agent_list': agents, 
            'show_results': show_results, 
            'is_paginated': True, 
        } 
    ) 
 
    return render_to_response('search.html', variables) 

我见过类似的问题,但我无法理解/使它们起作用。有什么帮助吗?


编辑: 对于快速修复(还没有真正看过缺点)

我在我的 View 中添加了一个变量:

variables = RequestContext(request,  
    {   'form': form, 
        'agent_list': agents, 
        'show_results': show_results, 
        'is_paginated': True, 
        **'query': query,** 
    } 
) 

不带引号的查询是接收到的query变量。

然后只需将 URL 更改为:

<a href="**?query={{query}}**&page={{ agent_list.previous_page_number }}">Previous</a> 

如果您有更好的方法来回答问题,请执行或将 URL 附加到您当前打开的 URL。

请您参考如下方法:

我建议将解决方案放在模板标签中,如下所示:

myapp/templatetags/mytemplatetags.py:

from django import template 
register = template.Library() 
 
@register.simple_tag 
def url_replace(request, field, value): 
    d = request.GET.copy() 
    d[field] = value 
    return d.urlencode() 
 
@register.simple_tag 
def url_delete(request, field): 
    d = request.GET.copy() 
    del d[field] 
    return d.urlencode() 

然后从模板做:

{% load mytemplatetags %} 
... 
<a href="?{% url_replace request 'page' agent_list.previous_page_number %}">previous</a>