diff --git a/website/blog/templates/blog/blog_post_list_page.html b/website/blog/templates/blog/blog_post_list_page.html
index 9a8b717..29bbd13 100644
--- a/website/blog/templates/blog/blog_post_list_page.html
+++ b/website/blog/templates/blog/blog_post_list_page.html
@@ -1,7 +1,5 @@
{% extends "common/listing_page.html" %}
-{% load wagtailroutablepage_tags %}
-
{% block hero_buttons %}
{{ block.super }}
diff --git a/website/common/models.py b/website/common/models.py
index e8c1be5..cfb24ab 100644
--- a/website/common/models.py
+++ b/website/common/models.py
@@ -295,6 +295,13 @@ class BaseListingPage(RoutablePageMixin, BaseContentPage):
def feed(self, request: HttpRequest) -> HttpResponse:
return redirect("feed", permanent=True)
+ @route(r"^random/$")
+ def random(self, request: HttpRequest) -> HttpResponse:
+ page = self.get_listing_pages().order_by("?").first()
+ if page is None:
+ return redirect(self.get_url(request=request), permanent=False)
+ return redirect(page.get_url(request=request), permanent=False)
+
class ListingPage(BaseListingPage):
pass
diff --git a/website/common/templates/common/listing_page.html b/website/common/templates/common/listing_page.html
index 3bda7cf..2b9f656 100644
--- a/website/common/templates/common/listing_page.html
+++ b/website/common/templates/common/listing_page.html
@@ -1,8 +1,10 @@
{% extends "common/content_page.html" %}
-{% load wagtailadmin_tags %}
+{% load wagtailadmin_tags wagtailroutablepage_tags %}
{% block hero_buttons %}
+
+
{% if listing_pages.has_previous %}
{% endif %}
diff --git a/website/common/tests/test_pages.py b/website/common/tests/test_pages.py
index e4eb406..2bc3a13 100644
--- a/website/common/tests/test_pages.py
+++ b/website/common/tests/test_pages.py
@@ -77,3 +77,12 @@ class ListingPageTestCase(TestCase):
self.assertEqual(
response.context["page"].get_meta_url(), self.page.full_url + "?page=2"
)
+
+ def test_random(self) -> None:
+ url = self.page.url + self.page.reverse_subpage("random")
+ with self.assertNumQueries(10):
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 302)
+ self.assertIn(
+ response.url, [page.get_url() for page in self.page.get_listing_pages()]
+ )