Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/django_bootstrap5/templatetags/django_bootstrap5.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,11 @@ def bootstrap_pagination(page, **kwargs):

:default: ``None``

extra_classes
Appends string as extra CSS classes to the pagination ul.

:default: ``None``

extra
Any extra page parameters.

Expand Down Expand Up @@ -733,6 +738,7 @@ def get_pagination_context(
url=None,
size=None,
justify_content=None,
extra_classes=None,
extra=None,
parameter_name="page",
):
Expand Down Expand Up @@ -800,6 +806,9 @@ def get_pagination_context(
" Valid values are 'start', 'center', 'end'."
)

if extra_classes:
pagination_css_classes.append(extra_classes)

return {
"bootstrap_pagination_url": url,
"num_pages": num_pages,
Expand Down
136 changes: 136 additions & 0 deletions tests/test_bootstrap_pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,131 @@ def test_paginator_illegal(self):
with self.assertRaises(ValueError):
self.render("{{% bootstrap_pagination page pages_to_show=-5 %}", {"page": self.paginator.page(2)})

def test_paginator_extra_css(self):
"""Test only the extra_classes parameter."""
# Test with single CSS class
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page extra_classes="custom-pagination" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination custom-pagination">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

# Test with multiple CSS classes
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page extra_classes="my-custom-class another-class" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination my-custom-class another-class">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

# Test with empty string (should not add anything)
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page extra_classes="" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

def test_paginator_extra_classes_with_size(self):
"""Test extra_classes combined with size parameter."""
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page size="sm" extra_classes="custom-small" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination pagination-sm custom-small">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

self.assertHTMLEqual(
self.render('{% bootstrap_pagination page size="lg" extra_classes="large-custom" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination pagination-lg large-custom">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

def test_paginator_extra_classes_with_justify(self):
"""Test extra_classes combined with justify_content parameter."""
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page justify_content="center" extra_classes="centered-custom" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination justify-content-center centered-custom">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

self.assertHTMLEqual(
self.render('{% bootstrap_pagination page justify_content="end" extra_classes="end-aligned" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination justify-content-end end-aligned">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

def test_paginator_extra_classes_with_all_options(self):
"""Test extra_classes combined with size and justify_content parameters."""
self.assertHTMLEqual(
self.render('{% bootstrap_pagination page size="lg" justify_content="center" extra_classes="all-options-test" %}', {"page": self.paginator.page(2)}),
(
'<ul class="pagination pagination-lg justify-content-center all-options-test">'
'<li class="page-item"><a class="page-link" href="?page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="?page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)

def test_paginator_extra_classes_with_url_and_extra(self):
"""Test extra_classes with URL and extra parameters."""
html = self.bootstrap_pagination(
self.paginator.page(2),
extra='url="/projects/?foo=bar" extra_classes="url-test-class"'
)
self.assertHTMLEqual(
html,
(
'<ul class="pagination url-test-class">'
'<li class="page-item"><a class="page-link" href="/projects/?foo=bar&page=1">&laquo;</a></li>'
'<li class="page-item"><a class="page-link" href="/projects/?foo=bar&page=1">1</a></li>'
'<li class="page-item active"><a class="page-link" href="#">2</a></li>'
'<li class="page-item disabled"><a class="page-link" href="#">&raquo;</a></li>'
"</ul>"
),
)


class LargePaginatorTestCase(BootstrapTestCase):
@classmethod
Expand All @@ -125,3 +250,14 @@ def test_paginator_ellipsis(self):
html = self.render("{{% bootstrap_pagination page %}", {"page": self.paginator.page(49)})
self.assertInHTML('<li class="page-item"><a class="page-link" href="?page=38">&hellip;</a></li>', html)
self.assertInHTML("&hellip;", html, count=1)

def test_paginator_ellipsis_with_extra_css(self):
"""Test that pagination_extra_classes works correctly with ellipsis pagination."""
html = self.render('{% bootstrap_pagination page extra_classes="ellipsis-test" %}', {"page": self.paginator.page(33)})

# Check that the extra CSS class is present
self.assertIn('class="pagination ellipsis-test"', html)

# Check that ellipsis are still rendered correctly
self.assertInHTML('<li class="page-item"><a class="page-link" href="?page=23">&hellip;</a></li>', html)
self.assertInHTML('<li class="page-item"><a class="page-link" href="?page=43">&hellip;</a></li>', html)