diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index b2b4d651018c11c5534ecd3c5a1e6790bd2b676c..30669efcfe428586ec483dd00efe2209671fb4e3 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -6,6 +6,7 @@ from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from image_cropping import ImageCropField, ImageRatioField
 from phonenumber_field.modelfields import PhoneNumberField
+from polymorphic.models import PolymorphicModel
 
 from .mixins import ExtensibleModel
 from .util.notifications import send_notification
@@ -229,7 +230,7 @@ class Notification(models.Model):
         verbose_name_plural = _("Notifications")
 
 
-class DashboardWidget(models.Model):
+class DashboardWidget(PolymorphicModel):
     template = None
 
     title = models.CharField(max_length=150, verbose_name=_("Widget Title"))
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 46b070449c3bc6ff46e98ace323953b7f6252ac1..c314e3a7305a2c1655de57df9d4ac05220b4238a 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -51,6 +51,7 @@ INSTALLED_APPS = [
     "django.contrib.sessions",
     "django.contrib.messages",
     "django.contrib.staticfiles",
+    "polymorphic",
     "django_global_request",
     "settings_context_processor",
     "sass_processor",
diff --git a/pyproject.toml b/pyproject.toml
index 1c3bdb77b59e270f075470b6b0dd82525d126073..99d24b842d98224ee165ce0ee0191a50a6523b01 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -63,6 +63,7 @@ django-celery-results = {version="^1.1.2", optional=true}
 django-celery-beat = {version="^1.5.0", optional=true}
 django-celery-email = {version="^3.0.0", optional=true}
 django-jsonstore = "^0.4.1"
+django-polymorphic = "^2.1.2"
 
 [tool.poetry.extras]
 ldap = ["django-auth-ldap"]