5

I want to use django pagination. The first page is able to load products but the last page is not showing them.

Here is my index view:

def index(request):

    categories = Category.objects.filter(parent_category=None)

    product_list = Product.objects.filter(is_deleted=False).order_by('created_at')
    paginator = Paginator(product_list, 1) # Show 25 contacts per page
    page = request.GET.get("page",1)

    try:
        products = paginator.page(page)
    except PageNotAnInteger:
        products = paginator.page(1)
    except EmptyPage:
        products = paginator.page(1)

    context = {
        'products': products,
        'categories': categories
    }
    return render(request, 'product/urunler.html', context)

Here is my template:

<div class="blog-pagination">
    <ul class="flat-pagination style1">
        {% if products.has_previous %}
            <li class="prev">
                <a href="?page={{products.previous_page_number}}" title="">
                    <img src="{% static 'images/icons/left-1.png' %}" alt="">Önceki Sayfa
                </a>
            </li>
        {% else %}
            <li class="prev">
                <a href="#" title="">
                    <img src="{% static 'images/icons/left-1.png' %}" alt="">Önceki Sayfa
                </a>
            </li>
        {% endif %}
        {% for i in products.paginator.page_range %}
            {% if products.number == i %}
                <li class="active">
                    <a href="?page={{i}}" class="waves-effect" title="">{{i}}</a>
                </li>
            {% else %}
                <li>
                    <a href="?page={{i}}" class="waves-effect" title="">{{i}}</a>
                </li>
            {% endif %}
        {% endfor %}
        {% if products.has_previous %}
            <li class="next">
                <a href="?page={{products.next_page_number}}" title="">
                    Sonraki Sayfa
                    <img src="{% static 'images/icons/right-1.png' %}" alt="">
                </a>
            </li>
        {% else %}
        {% if products.has_next %}
            <li class="next">
                    <a href="" title="">
                        Sonraki Sayfa
                        <img src="{% static 'images/icons/right-1.png' %}" alt="">
                    </a>
            </li>
        {% endif %}                                                           
        {% endif %}                           
    </ul>
    <div class="clearfix"></div>
</div>

I have 2 products in my database I'm able to show the first page but the last page is not showing here is the traceback:

Traceback (most recent call last):
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
ecommerce_1            |     response = get_response(request)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
ecommerce_1            |     response = self.process_exception_by_middleware(e, request)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
ecommerce_1            |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
ecommerce_1            |   File "/ecommerce/Product/views.py", line 22, in index
ecommerce_1            |     return render(request, 'product/urunler.html', context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/shortcuts.py", line 30, in render
ecommerce_1            |     content = loader.render_to_string(template_name, context, request, using=using)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/loader.py", line 68, in render_to_string
ecommerce_1            |     return template.render(context, request)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/backends/django.py", line 66, in render
ecommerce_1            |     return self.template.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 207, in render
ecommerce_1            |     return self._render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 199, in _render
ecommerce_1            |     return self.nodelist.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 990, in render
ecommerce_1            |     bit = node.render_annotated(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 957, in render_annotated
ecommerce_1            |     return self.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/loader_tags.py", line 177, in render
ecommerce_1            |     return compiled_parent._render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 199, in _render
ecommerce_1            |     return self.nodelist.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 990, in render
ecommerce_1            |     bit = node.render_annotated(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 957, in render_annotated
ecommerce_1            |     return self.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/loader_tags.py", line 72, in render
ecommerce_1            |     result = block.nodelist.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 990, in render
ecommerce_1            |     bit = node.render_annotated(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 957, in render_annotated
ecommerce_1            |     return self.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/defaulttags.py", line 322, in render
ecommerce_1            |     return nodelist.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 990, in render
ecommerce_1            |     bit = node.render_annotated(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 957, in render_annotated
ecommerce_1            |     return self.render(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 1040, in render
ecommerce_1            |     output = self.filter_expression.resolve(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 708, in resolve
ecommerce_1            |     obj = self.var.resolve(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 849, in resolve
ecommerce_1            |     value = self._resolve_lookup(context)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/template/base.py", line 911, in _resolve_lookup
ecommerce_1            |     current = current()
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/core/paginator.py", line 158, in next_page_number
ecommerce_1            |     return self.paginator.validate_number(self.number + 1)
ecommerce_1            |   File "/usr/local/lib/python3.6/site-packages/django/core/paginator.py", line 50, in validate_number
ecommerce_1            |     raise EmptyPage(_('That page contains no results'))

There is no error in the first page but the last page always comes with errors.

Eloims
  • 5,106
  • 4
  • 25
  • 41
user518851726681
  • 147
  • 3
  • 11

3 Answers3

3

You are checking has_previous but then including next_page_number. It looks like you want to include previous_page_number instead:

{% if products.has_previous %}
    <a href="?page={{products.previous_page_number}}" title="">Previous</a>
{% endif %}
Alasdair
  • 298,606
  • 55
  • 578
  • 516
0

In your code after for loop you are checking for has_previous and also you are making minor mistakes. your code after for loop should be

{% if products.has_next %}
 <li class="next">
  <a href="?page={{products.next_page_number}}" title="">Sonraki Sayfa
    <img src="{% static 'images/icons/right-1.png' %}" alt=""></a>
 </li>
{% else %}
 <li class="next">
  <a href="" title="">Sonraki Sayfa
    <img src="{% static 'images/icons/right-1.png' %}" alt=""></a>
 </li>
{% endif %}
Sumeet Kumar
  • 969
  • 1
  • 11
  • 22
0

Maybe is it also possible that you are making some tryes with paginators and you inserted more than one in you template to test their work/style?
If is that so, the django tags still work even if you comment the lines out.
So, if you want to test your paginator, you are forced to remove the others completely.

Tms91
  • 3,456
  • 6
  • 40
  • 74