diff --git a/django/core/management/commands/shell.py b/django/core/management/commands/shell.py
index 9616902..236a916 100644
--- a/django/core/management/commands/shell.py
+++ b/django/core/management/commands/shell.py
@@ -11,6 +11,26 @@ class Command(NoArgsCommand):
 
     requires_model_validation = False
 
+    def ipython(self):
+        import IPython
+        # Explicitly pass an empty list as arguments, because otherwise IPython
+        # would use sys.argv from this script.
+        shell = IPython.Shell.IPShell(argv=[])
+        shell.mainloop()
+
+    def bpython(self):
+        import bpython
+        bpython.embed()
+
+    def smart_shell(self):
+        shells = ('ipython', 'bpython')
+        for shell in shells:
+            try:
+                return getattr(self, shell)()
+            except ImportError:
+                pass
+        raise ImportError
+
     def handle_noargs(self, **options):
         # XXX: (Temporary) workaround for ticket #1796: force early loading of all
         # models from installed apps.
@@ -23,11 +43,7 @@ class Command(NoArgsCommand):
             if use_plain:
                 # Don't bother loading IPython, because the user wants plain Python.
                 raise ImportError
-            import IPython
-            # Explicitly pass an empty list as arguments, because otherwise IPython
-            # would use sys.argv from this script.
-            shell = IPython.Shell.IPShell(argv=[])
-            shell.mainloop()
+            self.smart_shell()
         except ImportError:
             import code
             # Set up a dictionary to serve as the environment for the shell, so
diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1
index ce3fdb1..4a459fd 100644
--- a/docs/man/django-admin.1
+++ b/docs/man/django-admin.1
@@ -65,10 +65,10 @@ for help on the KEY=val pairs.
 Starts a lightweight Web server for development.
 .TP
 .BI "shell [" "\-\-plain" "]"
-Runs a Python interactive interpreter. Tries to use IPython, if it's available.
+Runs a Python interactive interpreter. Tries to use IPython or bpython if either is available.
 The
 .BI \-\-plain
-option forces the use of the standard Python interpreter even when IPython is
+option forces the use of the standard Python interpreter even if IPython or bpython is
 installed.
 .TP
 .BI "sql [" "appname ..." "]"
@@ -131,7 +131,7 @@ Lets you manually add a directory the Python path,
 e.g. "/home/djangoprojects/myproject".
 .TP
 .I \-\-plain
-Use plain Python, not IPython, for the "shell" command.
+Use plain Python, not IPython or bpython, for the "shell" command.
 .TP
 .I \-\-noinput
 Do not prompt the user for input.
diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
index 67b1b6c..0ed1396 100644
--- a/docs/ref/django-admin.txt
+++ b/docs/ref/django-admin.txt
@@ -623,13 +623,14 @@ shell
 
 Starts the Python interactive interpreter.
 
-Django will use IPython_, if it's installed. If you have IPython installed and
-want to force use of the "plain" Python interpreter, use the ``--plain``
-option, like so::
+Django will use IPython_ or bpython_ if either is installed. If you have a
+rich shell installed but want to force use of the "plain" Python interpreter,
+use the ``--plain`` option, like so::
 
     django-admin.py shell --plain
 
 .. _IPython: http://ipython.scipy.org/
+.. _bpython: http://bpython-interpreter.org/
 
 sql <appname appname ...>
 -------------------------
