Browse Source

Fixed #36252 -- Handled duplicate automatic imports in the shell command.

hesham942 1 week ago
parent
commit
e804a07d76
3 changed files with 9 additions and 3 deletions
  1. 2 2
      django/core/management/commands/shell.py
  2. 2 1
      docs/howto/custom-shell.txt
  3. 5 0
      tests/shell/tests.py

+ 2 - 2
django/core/management/commands/shell.py

@@ -185,8 +185,8 @@ class Command(BaseCommand):
             else:
                 module = None
                 name = path
-
-            auto_imports[module].append((name, obj))
+            if (name, obj) not in auto_imports[module]:
+                auto_imports[module].append((name, obj))
 
         namespace = {
             name: obj for items in auto_imports.values() for name, obj in items

+ 2 - 1
docs/howto/custom-shell.txt

@@ -55,7 +55,8 @@ Running this customized ``shell`` command with ``verbosity=2`` would show:
       from django.urls import resolve, reverse
 
 If an overridden ``shell`` command includes paths that cannot be imported,
-these errors are shown when ``verbosity`` is set to ``1`` or higher.
+these errors are shown when ``verbosity`` is set to ``1`` or higher. Duplicate
+imports are automatically handled.
 
 Note that automatic imports can be disabled for a specific ``shell`` session
 using the :option:`--no-imports <shell --no-imports>` flag. To permanently

+ 5 - 0
tests/shell/tests.py

@@ -303,11 +303,16 @@ class ShellCommandAutoImportsTestCase(SimpleTestCase):
     def test_message_with_stdout_listing_objects_with_isort_not_installed(self):
         class TestCommand(shell.Command):
             def get_auto_imports(self):
+                # Include duplicate import strings to ensure proper handling,
+                # independent of isort's deduplication (#36252).
                 return super().get_auto_imports() + [
                     "django.urls.reverse",
                     "django.urls.resolve",
                     "shell",
                     "django",
+                    "django.urls.reverse",
+                    "shell",
+                    "django",
                 ]
 
         with captured_stdout() as stdout: