Why does the NoReverseMatch error pop up when trying to paginate my django website?

I have a list of data from my models that I would like to paginate as it looks flooded on one singular page and it generally takes a longer time for the page to load. However, when I tried to use a paginating method, it doesn't seem to work in my code.

What I've already done for my code is:

.../clubs/views.py

class ClubListView(generic.ListView):
    model = Club
    paginate_by = 6

.../clubs/urls.py

from django.urls import path
from . import views

app_name = "clubs"

urlpatterns = [
    path('', views.ClubListView.as_view(), name="club-list"),
    path('<int:pk>/', views.ClubDetailView.as_view(), name="club-detail"), 
]

.../clubs/club_list.html

{% block group_content %}
<hr>
{% comment %} Complete making group display. {% endcomment %}
<p></p>
<div class="col-md-8">
    <div class="container">
        {% for club in club_list %}
        <a class="list-group-item" href="{{ club.get_absolute_url }}">
            <h3 class="title list-group-item-heading">{{ club.name }}</h3>
            <span>{{ club.slogan|safe }}</span>
        </a>
        <p></p>
        <br>
        {% endfor %}
    </div>
</div>

{% endblock %}

{% block pagination %}
    {% if page_obj.has_previous %}
        <a href="{% url 'club-list' page_obj.previous_page_number %}">
            Previous Page
        </a>
    {% endif%}
    {% if page_obj.has_next %}
        <a href="{% url 'club-list' page_obj.next_page_number %}">
            Next Page
        </a>
    {% endif%}
{% endblock %}

However, it still gives me the error of NoReverseMatch of 'club-list' in my html page even though it is given from the urls.py file. I'm not sure if I don't understand where the issue is coming from.

You are passing the next page number/prev page number as part of the {% url %} function which creates the path, however your URLS.py isn't expecting it as part of the URL path. eg, you don't have a urlpattern for listview/12/.

For a list view, by default next and prev pages numbers gets passed as part of the querystring rather than the path,eg,

/listview?page=12

so your template should look more like (from the docs)

{% block pagination %}
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

         Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.

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

{% endblock %}
Back to Top