diff --git a/roles/constellation/tasks/main.yml b/roles/constellation/tasks/main.yml
index 403e351d691a34ca07012a2ade6047b94ed38aa4..ec39f4a80cd33dd50dd056190c75a13c2b83ef3b 100644
--- a/roles/constellation/tasks/main.yml
+++ b/roles/constellation/tasks/main.yml
@@ -1,4 +1,12 @@
 ---
+- name: Pin Django from Debian experimental until bullseye-backports exists
+  template:
+    src: "apt/{{ item }}.j2"
+    dest: "/etc/apt/{{ item }}"
+  loop:
+    - sources.list.d/experimental.list
+    - preferences.d/django-experimental
+
 - name: Install constellation dependencies
   apt:
     update_cache: true
diff --git a/roles/constellation/templates/apt/preferences.d/django-experimental.j2 b/roles/constellation/templates/apt/preferences.d/django-experimental.j2
new file mode 100644
index 0000000000000000000000000000000000000000..07050664645d1256498696905e81b3d7dbc2b0b6
--- /dev/null
+++ b/roles/constellation/templates/apt/preferences.d/django-experimental.j2
@@ -0,0 +1,16 @@
+{{ ansible_header | comment }}
+
+
+Package: *
+Pin: release n=experimental
+Pin-Priority: 1
+
+
+Package: python3-django
+Pin: release n=experimental
+Pin-Priority: 900
+
+
+Package: python3-django-tables2
+Pin: release n=experimental
+Pin-Priority: 900
diff --git a/roles/constellation/templates/apt/sources.list.d/experimental.list.j2 b/roles/constellation/templates/apt/sources.list.d/experimental.list.j2
new file mode 100644
index 0000000000000000000000000000000000000000..e645773fcbe15cdad0c58ea957c895e3ad66a4d8
--- /dev/null
+++ b/roles/constellation/templates/apt/sources.list.d/experimental.list.j2
@@ -0,0 +1,3 @@
+{{ ansible_header | comment }}
+
+deb {{ debian_mirror }} experimental main