Fixed #35515 -- Added automatic model imports to shell management command.

Thanks to Bhuvnesh Sharma and Adam Johnson for mentoring this Google
Summer of Code 2024 project. Thanks to Sarah Boyce, David Smith, Jacob
Walls and Natalia Bidart for reviews.
This commit is contained in:
Salvo Polizzi 2025-01-09 17:00:29 +01:00 committed by GitHub
parent 8c118c0e00
commit fc28550fe4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 374 additions and 19 deletions

View file

@ -157,6 +157,8 @@ Testing
Information on how to test custom management commands can be found in the
:ref:`testing docs <topics-testing-management-commands>`.
.. _overriding-commands:
Overriding commands
===================

View file

@ -0,0 +1,57 @@
======================================
How to customize the ``shell`` command
======================================
The Django :djadmin:`shell` is an interactive Python environment that provides
access to models and settings, making it useful for testing code, experimenting
with queries, and interacting with application data.
Customizing the :djadmin:`shell` command allows adding extra functionality or
pre-loading specific modules. To do this, create a new management command that subclasses
``django.core.management.commands.shell.Command`` and overrides the existing
``shell`` management command. For more details, refer to the guide on
:ref:`overriding commands <overriding-commands>`.
.. _customizing-shell-auto-imports:
Customize automatic imports
===========================
.. versionadded:: 5.2
To customize the automatic import behavior of the :djadmin:`shell` management
command, override the ``get_namespace()`` method. For example:
.. code-block:: python
:caption: ``polls/management/commands/shell.py``
from django.core.management.commands import shell
class Command(shell.Command):
def get_namespace(self):
from django.urls.base import resolve, reverse
return {
**super().get_namespace(),
"resolve": resolve,
"reverse": reverse,
}
The above customization adds :func:`~django.urls.resolve` and
:func:`~django.urls.reverse` to the default namespace, which includes all
models from all apps. These two functions will then be available when the
shell opens, without a manual import statement.
If you prefer to not have models automatically imported, create a custom
``get_namespace()`` that excludes the ``super().get_namespace()`` call:
.. code-block:: python
:caption: ``polls/management/commands/shell.py``
from django.core.management.commands import shell
class Command(shell.Command):
def get_namespace(self):
return {}

View file

@ -58,8 +58,9 @@ Other guides
auth-remote-user
csrf
custom-management-commands
custom-file-storage
custom-management-commands
custom-shell
.. seealso::