diff --git a/district/models.py b/district/models.py
index 161e08ac2c3aa5a5ca6635dc5c0c8969e6e766c8..235c42c2411882d1e43ef351f52c42b50547e413 100644
--- a/district/models.py
+++ b/district/models.py
@@ -4,7 +4,6 @@ from functools import cached_property
 
 from django.core.cache import cache
 from django.core.exceptions import ValidationError
-from django.core.paginator import Paginator
 from django.db import models
 from django.http import HttpResponseNotFound, HttpResponseRedirect
 from django.shortcuts import render
@@ -543,13 +542,12 @@ class DistrictArticlesPage(
 
     def get_context(self, request):
         context = super().get_context(request)
-        context["articles"] = self.materialize_shared_articles_query(
-            Paginator(
-                self.append_all_shared_articles_query(
-                    DistrictArticlePage.objects.child_of(self)
-                ),
-                self.max_items,
-            ).get_page(request.GET.get("page"))
+        context["articles"] = self.get_page_with_shared_articles(
+            self.append_all_shared_articles_query(
+                DistrictArticlePage.objects.child_of(self)
+            ),
+            self.max_items,
+            request.GET.get("page"),
         )
         return context
 
@@ -615,11 +613,8 @@ class DistrictArticlesPage(
             )
 
         return {
-            "article_page_list": self.materialize_shared_articles_query(
-                Paginator(
-                    article_page_qs,
-                    self.max_items,
-                ).get_page(request.GET.get("page"))
+            "article_page_list": self.get_page_with_shared_articles(
+                article_page_qs, self.max_items, request.GET.get("page")
             ),
             "tag": tag,
         }
diff --git a/main/models.py b/main/models.py
index f73fb97c533259702322307153df0e44bdb7f9f1..6b8392558b79edff1eba2bcaf53ae008dffe7166 100644
--- a/main/models.py
+++ b/main/models.py
@@ -501,16 +501,14 @@ class MainArticlesPage(
         return JsonResponse(data=data, safe=False)
 
     def get_articles_response(self, request):
-        article_paginator = Paginator(
+        article_page = self.get_page_with_shared_articles(
             self.append_all_shared_articles_query(
                 MainArticlePage.objects.filter(
                     article_type=ARTICLE_TYPES.PRESS_RELEASE
                 ),
             ).order_by("union_date", "union_title"),
             10,
-        )
-        article_page = self.materialize_shared_articles_query(
-            article_paginator.get_page(request.GET.get("page", 1))
+            request.GET.get("page", 1),
         )
         context = {"article_data_list": article_page.object_list}
         html_content = render(
@@ -523,7 +521,7 @@ class MainArticlesPage(
         return JsonResponse(data=data, safe=False)
 
     def get_all_articles_search_response(self, request):
-        article_paginator = Paginator(
+        article_page = self.get_page_with_shared_articles(
             self.append_all_shared_articles_query(
                 MainArticlePage.objects.search(
                     request.GET["q"],
@@ -531,9 +529,7 @@ class MainArticlesPage(
                 )
             ),
             10,
-        )
-        article_page = self.materialize_shared_articles_query(
-            article_paginator.get_page(request.GET.get("page", 1))
+            request.GET.get("page", 1),
         )
         context = {"article_data_list": article_page.object_list}
         html_content = render(
diff --git a/shared/models.py b/shared/models.py
index 9d5de087a8a6b87daf5ad045a596834bb4b32929..14943b91d8945414374a8ce219a00b3386f8ec03 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -3,10 +3,10 @@ from enum import Enum
 from functools import reduce
 
 from django.apps import apps
+from django.core.paginator import Paginator
 from django.db import models
 from django.db.models import Q
-from django.db.models.expressions import ExpressionWrapper, F, Value
-from django.db.models.functions import Coalesce
+from django.db.models.expressions import F, Value
 from django.utils import timezone
 from modelcluster.fields import ParentalKey, ParentalManyToManyField
 from taggit.models import ItemBase, Tag, TagBase
@@ -545,6 +545,16 @@ class ArticlesMixin(models.Model):
                 )
             )
 
+    def get_page_with_shared_articles(
+        self, query: models.QuerySet, page_size: int, page: int
+    ):
+        return self.materialize_shared_articles_query(
+            Paginator(
+                query,
+                page_size,
+            ).get_page(page)
+        )
+
     def append_all_shared_articles(
         self, previous_query: models.QuerySet | None = None, custom_article_query=None
     ):
diff --git a/uniweb/models.py b/uniweb/models.py
index 916c8776ce938eeac1a6e1b6cad9864f58a1bed6..4d38b4fe5ff77792217fa70be732c12246ee131e 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -2,7 +2,6 @@ import random
 
 from captcha.fields import CaptchaField
 from django import forms
-from django.core.paginator import Paginator
 from django.db import models
 from django.utils.translation import gettext_lazy
 from modelcluster.contrib.taggit import ClusterTaggableManager
@@ -566,8 +565,10 @@ class UniwebArticlesIndexPage(
             else articles,
         )
 
-        context["articles"] = self.materialize_shared_articles_query(
-            Paginator(articles, ARTICLES_PER_PAGE).get_page(num)
+        context["articles"] = self.get_page_with_shared_articles(
+            articles,
+            ARTICLES_PER_PAGE,
+            num,
         )
         context["tags"] = self.search_tags_by_unioned_id_query(articles_ids)
         context["active_tag"] = tag