diff --git a/donate/models.py b/donate/models.py
index f4a78aa0a472a354ae298672281ab50310093f1c..895d46088414569650809f5a4b3d3ab150d6b897 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -1,3 +1,5 @@
+from functools import cached_property
+
 from django.conf import settings
 from django.core.cache import cache
 from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
@@ -190,19 +192,19 @@ class DonateHomePage(DonateFormMixin, DonateFormAmountsMixin, Page, MetadataPage
     def root_page(self):
         return self
 
-    @property
+    @cached_property
     def info_page_url(self):
         return get_subpage_url(self, DonateInfoPage)
 
-    @property
+    @cached_property
     def projects_page_url(self):
         return get_subpage_url(self, DonateProjectIndexPage)
 
-    @property
+    @cached_property
     def regions_page_url(self):
         return get_subpage_url(self, DonateRegionIndexPage)
 
-    @property
+    @cached_property
     def has_projects(self):
         return self.get_descendants().type(DonateProjectPage).live().exists()
 
@@ -324,11 +326,11 @@ class DonateRegionPage(
     def get_meta_title(self):
         return self.seo_title or self.main_title
 
-    @property
+    @cached_property
     def targeted_donations_page_url(self):
         return get_subpage_url(self, DonateTargetedDonationsPage)
 
-    @property
+    @cached_property
     def has_targeted_donations(self):
         return self.get_descendants().type(DonateTargetedDonationsPage).live().exists()
 
@@ -603,7 +605,7 @@ class DonateInfoPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
         verbose_name = "Infostránka s formulářem"
 
     # use portal_project_id from home page
-    @property
+    @cached_property
     def portal_project_id(self):
         return self.get_parent().specific.portal_project_id