Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Next and Before Links for a django paginated query

I'm trying to make a search form for Django.

Its a typical search form and then returns a table of matches. I wish to paginate the tables returned.

The problem lies in the Previous and Next buttons. The links for the return query goes to /records/search/?query=a (search sample is a) The page outputs the table and its previous and next links. However the links redirect to /records/search/?page=2 and the page displays a blank table.

Any help on which links I should pass for 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 %}

and the search 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)

I've seen the similar questions but I can't understand/make them work. Any help?


Edit: For a quickfix (haven't really looked at the cons)

I added a variable in my view:

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

Where query without the quotes is the recieved query variable.

Then simply change the URL to:

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

If you have a better way of answering the question, please do or appending a URL to your currently opened URL.

like image 638
Jordin Vell Avatar asked Oct 12 '25 07:10

Jordin Vell


2 Answers

I would recommend putting the solution in a template tag like so:

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()

Then from templates do:

{% load mytemplatetags %}
...
<a href="?{% url_replace request 'page' agent_list.previous_page_number %}">previous</a>
like image 148
Ben Wilber Avatar answered Oct 16 '25 07:10

Ben Wilber


you can use {{ request.get_full_path }} this tag to get current url.

<a href="{{ request.get_full_path }}&page={{ agent_list.next_page_number }}">Next</a>

this worked for me

like image 26
syed mudaseer Avatar answered Oct 16 '25 09:10

syed mudaseer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!