浏览代码

Fixed #22770 -- Removed create_superuser from post_migrate signals.

Moved logic to syncdb command for backwards compatibility.
Tim Graham 10 年之前
父节点
当前提交
93d05536fd

+ 1 - 30
django/contrib/auth/management/__init__.py

@@ -7,15 +7,13 @@ import getpass
 import unicodedata
 import unicodedata
 
 
 from django.apps import apps
 from django.apps import apps
-from django.contrib.auth import (models as auth_app, get_permission_codename,
-    get_user_model)
+from django.contrib.auth import models as auth_app, get_permission_codename
 from django.core import exceptions
 from django.core import exceptions
 from django.core.management.base import CommandError
 from django.core.management.base import CommandError
 from django.db import DEFAULT_DB_ALIAS, router
 from django.db import DEFAULT_DB_ALIAS, router
 from django.db.models import signals
 from django.db.models import signals
 from django.utils.encoding import DEFAULT_LOCALE_ENCODING
 from django.utils.encoding import DEFAULT_LOCALE_ENCODING
 from django.utils import six
 from django.utils import six
-from django.utils.six.moves import input
 
 
 
 
 def _get_all_permissions(opts, ctype):
 def _get_all_permissions(opts, ctype):
@@ -119,30 +117,6 @@ def create_permissions(app_config, verbosity=2, interactive=True, using=DEFAULT_
             print("Adding permission '%s'" % perm)
             print("Adding permission '%s'" % perm)
 
 
 
 
-def create_superuser(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs):
-    try:
-        apps.get_model('auth', 'Permission')
-    except LookupError:
-        return
-
-    UserModel = get_user_model()
-
-    from django.core.management import call_command
-
-    if not UserModel._default_manager.exists() and interactive:
-        msg = ("\nYou have installed Django's auth system, and "
-            "don't have any superusers defined.\nWould you like to create one "
-            "now? (yes/no): ")
-        confirm = input(msg)
-        while 1:
-            if confirm not in ('yes', 'no'):
-                confirm = input('Please enter either "yes" or "no": ')
-                continue
-            if confirm == 'yes':
-                call_command("createsuperuser", interactive=True, database=using)
-            break
-
-
 def get_system_username():
 def get_system_username():
     """
     """
     Try to determine the current system user's username.
     Try to determine the current system user's username.
@@ -207,6 +181,3 @@ def get_default_username(check_db=True):
 
 
 signals.post_migrate.connect(create_permissions,
 signals.post_migrate.connect(create_permissions,
     dispatch_uid="django.contrib.auth.management.create_permissions")
     dispatch_uid="django.contrib.auth.management.create_permissions")
-signals.post_migrate.connect(create_superuser,
-    sender=apps.get_app_config('auth'),
-    dispatch_uid="django.contrib.auth.management.create_superuser")

+ 23 - 0
django/core/management/commands/syncdb.py

@@ -1,10 +1,13 @@
 import warnings
 import warnings
 from optparse import make_option
 from optparse import make_option
 
 
+from django.apps import apps
+from django.contrib.auth import get_user_model
 from django.db import DEFAULT_DB_ALIAS
 from django.db import DEFAULT_DB_ALIAS
 from django.core.management import call_command
 from django.core.management import call_command
 from django.core.management.base import NoArgsCommand
 from django.core.management.base import NoArgsCommand
 from django.utils.deprecation import RemovedInDjango19Warning
 from django.utils.deprecation import RemovedInDjango19Warning
+from django.utils.six.moves import input
 
 
 
 
 class Command(NoArgsCommand):
 class Command(NoArgsCommand):
@@ -22,3 +25,23 @@ class Command(NoArgsCommand):
     def handle_noargs(self, **options):
     def handle_noargs(self, **options):
         warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)
         warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)
         call_command("migrate", **options)
         call_command("migrate", **options)
+
+        try:
+            apps.get_model('auth', 'Permission')
+        except LookupError:
+            return
+
+        UserModel = get_user_model()
+
+        if not UserModel._default_manager.exists() and options.get('interactive'):
+            msg = ("\nYou have installed Django's auth system, and "
+                "don't have any superusers defined.\nWould you like to create one "
+                "now? (yes/no): ")
+            confirm = input(msg)
+            while 1:
+                if confirm not in ('yes', 'no'):
+                    confirm = input('Please enter either "yes" or "no": ')
+                    continue
+                if confirm == 'yes':
+                    call_command("createsuperuser", interactive=True, database=options['database'])
+                break

+ 1 - 34
docs/intro/tutorial01.txt

@@ -206,40 +206,7 @@ The :djadmin:`migrate` command looks at the :setting:`INSTALLED_APPS` setting
 and creates any necessary database tables according to the database settings
 and creates any necessary database tables according to the database settings
 in your :file:`mysite/settings.py` file and the database migrations shipped
 in your :file:`mysite/settings.py` file and the database migrations shipped
 with the app (we'll cover those later). You'll see a message for each
 with the app (we'll cover those later). You'll see a message for each
-migration it applies, and you'll get a prompt asking you if you'd like to
-create a superuser account for the authentication system.
-
-First, you'll be asked if you would like to create a superuser. Type the word
-``yes`` and hit enter.
-
-.. code-block:: text
-
-    You have installed Django's auth system, and don't have any superusers defined.
-    Would you like to create one now? (yes/no): yes
-
-Next, enter a username. By default, this will be your system username. Enter
-your desired username and press enter.
-
-.. code-block:: text
-
-    Username (leave blank to use 'your_username'): admin
-
-You will then be prompted for your desired email address:
-
-.. code-block:: text
-
-    Email address: admin@example.com
-
-The final step is to enter your password. You will be asked to enter your
-password twice, the second time as a confirmation of the first.
-
-.. code-block:: text
-
-    Password: **********
-    Password (again): *********
-    Superuser created successfully.
-
-With that done, if you're interested, run the command-line client for your
+migration it applies. If you're interested, run the command-line client for your
 database and type ``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MySQL), or
 database and type ``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MySQL), or
 ``.schema`` (SQLite) to display the tables Django created.
 ``.schema`` (SQLite) to display the tables Django created.
 
 

+ 32 - 4
docs/intro/tutorial02.txt

@@ -21,6 +21,37 @@ automatically-generated admin site.
     The admin isn't intended to be used by site visitors. It's for site
     The admin isn't intended to be used by site visitors. It's for site
     managers.
     managers.
 
 
+Creating an admin user
+======================
+
+First we'll need to create a user who can login to the admin site. Run the
+following command:
+
+.. code-block:: bash
+
+    $ python manage.py createsuperuser
+
+Enter your desired username and press enter.
+
+.. code-block:: text
+
+    Username: admin
+
+You will then be prompted for your desired email address:
+
+.. code-block:: text
+
+    Email address: admin@example.com
+
+The final step is to enter your password. You will be asked to enter your
+password twice, the second time as a confirmation of the first.
+
+.. code-block:: text
+
+    Password: **********
+    Password (again): *********
+    Superuser created successfully.
+
 Start the development server
 Start the development server
 ============================
 ============================
 
 
@@ -59,10 +90,7 @@ browser's settings and on whether Django has a translation for this language.
 Enter the admin site
 Enter the admin site
 ====================
 ====================
 
 
-Now, try logging in. You created a superuser account in the first part of this
-tutorial, remember?  If you didn't create one or forgot the password you can
-:ref:`create another one <topics-auth-creating-superusers>`.
-
+Now, try logging in with the superuser account you created in the previous step.
 You should see the Django admin index page:
 You should see the Django admin index page:
 
 
 .. image:: _images/admin02.png
 .. image:: _images/admin02.png

+ 2 - 3
docs/ref/django-admin.txt

@@ -1435,9 +1435,8 @@ This command is only available if Django's :doc:`authentication system
 </topics/auth/index>` (``django.contrib.auth``) is installed.
 </topics/auth/index>` (``django.contrib.auth``) is installed.
 
 
 Creates a superuser account (a user who has all permissions). This is
 Creates a superuser account (a user who has all permissions). This is
-useful if you need to create an initial superuser account but did not
-do so during the first :djadmin:`migrate`, or if you need to programmatically
-generate superuser accounts for your site(s).
+useful if you need to create an initial superuser account or if you need to
+programmatically generate superuser accounts for your site(s).
 
 
 When run interactively, this command will prompt for a password for
 When run interactively, this command will prompt for a password for
 the new superuser account. When run non-interactively, no password
 the new superuser account. When run non-interactively, no password

+ 1 - 3
docs/topics/auth/default.txt

@@ -66,9 +66,7 @@ interactively <auth-admin>`.
 Creating superusers
 Creating superusers
 -------------------
 -------------------
 
 
-:djadmin:`manage.py migrate <migrate>` prompts you to create a superuser the
-first time you run it with ``'django.contrib.auth'`` installed. If you need to
-create a superuser at a later date, you can use a command line utility::
+Create superusers using the :djadmin:`createsuperuser` command::
 
 
     $ python manage.py createsuperuser --username=joe --email=joe@example.com
     $ python manage.py createsuperuser --username=joe --email=joe@example.com