Python Forum

Full Version: Filtering and pagination
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have 50k+ records so I need to use pagination, also users need to be able to search through the queryset, I cannot get it to work. In the following code the pagination works but not the filtering, any ideas? The client needs it up and running on Monday!

views.py:
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from . import filters

def listing(request):
    # BTW you do not need .all() after a .filter()
    # local_url.objects.filter(global_url__id=1) will do
    filtered_qs = filters.SampleFilter(request.GET,queryset=Samples.objects.all()).qs
    paginator = Paginator(filtered_qs, 15)
    page = request.GET.get('page')
    try:
        response = paginator.page(page)
    except PageNotAnInteger:
        response = paginator.page(1)
    except EmptyPage:
        response = paginator.page(paginator.num_pages)
    return render(request,'search/page.html',{'response': response})
Template:
{% extends 'search/base.html' %}
{% load widget_tweaks %}
{% block content %}

<form method="get">
  <div class="well container">
    <h4 style="margin-top: 0">Filter</h4>
    <div class="row">
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.sample_id.label_tag }}
        {% render_field filter.form.sample_id class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.area_easting.label_tag }}
        {% render_field filter.form.area_easting class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.area_northing.label_tag }}
        {% render_field filter.form.area_northing class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.context_number.label_tag }}
        {% render_field filter.form.context_number class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.sample_number.label_tag }}
        {% render_field filter.form.sample_number class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ response.material.label_tag }}
        {% render_field filter.form.material class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.specific_material.label_tag }}
        {% render_field filter.form.specific_material class="form-control" %}
      </div>
    </div>
    <button type="submit" class="btn btn-primary">
      <span class="glyphicon glyphicon-search"></span> Search
    </button>
    <a href="{% url 'containersearch' %}">
    <button type="submit" class="btn btn-secondary">
      <span class="glyphicon glyphicon-search"></span> Reset
    </button>
  </a>
  </div>
</form>

<div class="container-fluid pt-3">
<table class="table table-bordered">
  <thead>
    <tr>
      <th>Sample(id)</th>
      <th>Area Easting</th>
      <th>Area Northing</th>
      <th>Context Number</th>
      <th>Material</th>
      <th>Specific Material</th>
      <th>actions</th>
    </tr>
  </thead>
  <tbody>

{% for samples in response %}

<tr>
  <td>{{ samples.sample_id }}</td>
  <td>{{ samples.area_easting }}</td>
  <td>{{ samples.area_northing }}</td>
  <td>{{ samples.context_number }}</td>
  <td>{{ samples.sample_number }}</td>
  <td>{{ samples.material }}</td>
  <td>
    <div class="btn-group" role="group" aria-label="Basic example">

  <a href="{% url 'editsamplesearch' pk=samples.pk %}" class="btn btn-primary" role="button">edit</a>
  <a href="{% url 'editsamplesearch' pk=samples.pk %}" class="btn btn-secondary" role="button">take out</a>
  <a href="{% url 'editsamplesearch' pk=samples.pk %}" class="btn btn-secondary" role="button">request</a>
  </div>
  </td>

</tr>
{% empty %}
<tr>
  <td colspan="5">No data</td>
</tr>

{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if response.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ response.previous_page_number }}">previous</a>
        {% endif %}
        <span class="current">
            Page {{ response.number }} of {{ response.paginator.num_pages }}.
        </span>

        {% if response.has_next %}
            <a href="?page={{ response.next_page_number }}">next</a>
            <a href="?page={{ response.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>
{% endblock %}