diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index c95e4ec104..2971c0b10e 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -11,6 +11,7 @@ Changelog
 ~~~~~~~~~~~~~~~~~~~
 
  * Fix: Ensure that cached `wagtail_site_root_paths` structures from older Wagtail versions are invalidated (Sævar Öfjörð Magnússon)
+ * Fix: Avoid circular import between wagtail.admin.auth and custom user models (Matt Westcott)
 
 
 2.11 LTS (02.11.2020)
diff --git a/docs/releases/2.11.1.rst b/docs/releases/2.11.1.rst
index 5f031e50e4..3276d75ade 100644
--- a/docs/releases/2.11.1.rst
+++ b/docs/releases/2.11.1.rst
@@ -14,3 +14,4 @@ Bug fixes
 ~~~~~~~~~
 
  * Ensure that cached ``wagtail_site_root_paths`` structures from older Wagtail versions are invalidated (Sævar Öfjörð Magnússon)
+ * Avoid circular import between wagtail.admin.auth and custom user models (Matt Westcott)
diff --git a/wagtail/admin/auth.py b/wagtail/admin/auth.py
index 0a3fe9df3c..ba4837b3ce 100644
--- a/wagtail/admin/auth.py
+++ b/wagtail/admin/auth.py
@@ -5,7 +5,6 @@ from functools import wraps
 import l18n
 
 from django.contrib.auth import get_user_model
-from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login
 from django.core.exceptions import PermissionDenied
 from django.db.models import Q
 from django.shortcuts import redirect
@@ -145,6 +144,9 @@ def reject_request(request):
     if request.is_ajax():
         raise PermissionDenied
 
+    # import redirect_to_login here to avoid circular imports on model files that import
+    # wagtail.admin.auth, specifically where custom user models are involved
+    from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login
     return auth_redirect_to_login(
         request.get_full_path(), login_url=reverse('wagtailadmin_login'))
 
diff --git a/wagtail/tests/customuser/models.py b/wagtail/tests/customuser/models.py
index 78869d30ac..c7a29ff392 100644
--- a/wagtail/tests/customuser/models.py
+++ b/wagtail/tests/customuser/models.py
@@ -1,6 +1,10 @@
 from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
 from django.db import models
 
+# make sure we can import wagtail.admin.auth here without triggering a circular import
+# (which is easily done because it's dealing with django.contrib.auth views which depend
+# on the user model)
+from wagtail.admin.auth import permission_denied  # noqa
 from wagtail.admin.edit_handlers import FieldPanel
 
 from .fields import ConvertedValueField