django 分页查询的 Next 和 Before 链接

Jor*_*ell 2 python django pagination

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

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

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

关于我应该为上一个/下一个传递哪些链接的任何帮助?

搜索.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 %}
Run Code Online (Sandbox Code Playgroud)

和搜索视图:

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)
Run Code Online (Sandbox Code Playgroud)

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


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

我在视图中添加了一个变量:

variables = RequestContext(request, 
    {   'form': form,
        'agent_list': agents,
        'show_results': show_results,
        'is_paginated': True,
        **'query': query,**
    }
)
Run Code Online (Sandbox Code Playgroud)

没有引号的查询是收到的 query变量。

然后只需将 URL 更改为:

<a href="**?query={{query}}**&page={{ agent_list.previous_page_number }}">Previous</a>
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ber 6

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

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()
Run Code Online (Sandbox Code Playgroud)

然后从模板做:

{% load mytemplatetags %}
...
<a href="?{% url_replace request 'page' agent_list.previous_page_number %}">previous</a>
Run Code Online (Sandbox Code Playgroud)