text: import os
  from django.core.management.base import NoArgsCommand
  from optparse import make_option
  
  class Command(NoArgsCommand):
      option_list = NoArgsCommand.option_list + (
          make_option('--plain', action='store_true', dest='plain',
              help='Tells Django to use plain Python, not IPython.'),
      )
      help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available."
  
      requires_model_validation = False
  
      def handle_noargs(self, **options):
          # XXX: (Temporary) workaround for ticket #1796: force early loading of all
          # models from installed apps.
          from django.db.models.loading import get_models
          loaded_models = get_models()
  
          use_plain = options.get('plain', False)
  
          try:
              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()
          except ImportError:
              import code
              # Set up a dictionary to serve as the environment for the shell, so
              # that tab completion works on objects that are imported at runtime.
              # See ticket 5082.
              imported_objects = {}
              try: # Try activating rlcompleter, because it's handy.
                  import readline
              except ImportError:
                  pass
              else:
                  # We don't have to wrap the following import in a 'try', because
                  # we already know 'readline' was imported successfully.
                  import rlcompleter
                  readline.set_completer(rlcompleter.Completer(imported_objects).complete)
                  readline.parse_and_bind("tab:complete")
  
              # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
              # conventions and get $PYTHONSTARTUP first then import user.
              if not use_plain: 
                  pythonrc = os.environ.get("PYTHONSTARTUP") 
                  if pythonrc and os.path.isfile(pythonrc): 
                      try: 
                          execfile(pythonrc) 
                      except NameError: 
                          pass
                  # This will import .pythonrc.py as a side-effect
                  import user
              code.interact(local=imported_objects)
  