diff --git a/django/utils/deprecation.py b/django/utils/deprecation.py index daa485eb35bf..4aa11832165e 100644 --- a/django/utils/deprecation.py +++ b/django/utils/deprecation.py @@ -13,9 +13,8 @@ @functools.cache def django_file_prefixes(): - try: - file = django.__file__ - except AttributeError: + file = getattr(django, "__file__", None) + if file is None: return () return (os.path.dirname(file),) diff --git a/docs/releases/6.0.3.txt b/docs/releases/6.0.3.txt index 048921db8bdb..8777b1ef2196 100644 --- a/docs/releases/6.0.3.txt +++ b/docs/releases/6.0.3.txt @@ -17,6 +17,9 @@ Bugfixes to :ref:`override` ``as_sql()`` to accept any sequence (:ticket:`36934`). +* Fixed :exc:`TypeError` when deprecation warnings are emitted in environments + importing Django by namespace (:ticket:`36961`). + * Fixed a visual regression where fieldset legends were misaligned in the admin (:ticket:`36920`). diff --git a/tests/deprecation/tests.py b/tests/deprecation/tests.py index 2df9cc6fa219..ac610b492835 100644 --- a/tests/deprecation/tests.py +++ b/tests/deprecation/tests.py @@ -18,6 +18,10 @@ def setUp(self): def test_no_file(self): orig_file = django.__file__ try: + # Depending on the cwd, Python might give a local checkout + # precedence over installed Django, producing None. + django.__file__ = None + self.assertEqual(django_file_prefixes(), ()) del django.__file__ self.assertEqual(django_file_prefixes(), ()) finally: