|
@@ -51,11 +51,28 @@ class Command(BaseCommand):
|
|
default=DEFAULT_DB_ALIAS,
|
|
default=DEFAULT_DB_ALIAS,
|
|
help='Specifies the database to use. Default is "default".',
|
|
help='Specifies the database to use. Default is "default".',
|
|
)
|
|
)
|
|
- for field in self.UserModel.REQUIRED_FIELDS:
|
|
+ for field_name in self.UserModel.REQUIRED_FIELDS:
|
|
- parser.add_argument(
|
|
+ field = self.UserModel._meta.get_field(field_name)
|
|
- '--%s' % field,
|
|
+ if field.many_to_many:
|
|
- help='Specifies the %s for the superuser.' % field,
|
|
+ if field.remote_field.through and not field.remote_field.through._meta.auto_created:
|
|
- )
|
|
+ raise CommandError(
|
|
|
|
+ "Required field '%s' specifies a many-to-many "
|
|
|
|
+ "relation through model, which is not supported."
|
|
|
|
+ % field_name
|
|
|
|
+ )
|
|
|
|
+ else:
|
|
|
|
+ parser.add_argument(
|
|
|
|
+ '--%s' % field_name, action='append',
|
|
|
|
+ help=(
|
|
|
|
+ 'Specifies the %s for the superuser. Can be used '
|
|
|
|
+ 'multiple times.' % field_name,
|
|
|
|
+ ),
|
|
|
|
+ )
|
|
|
|
+ else:
|
|
|
|
+ parser.add_argument(
|
|
|
|
+ '--%s' % field_name,
|
|
|
|
+ help='Specifies the %s for the superuser.' % field_name,
|
|
|
|
+ )
|
|
|
|
|
|
def execute(self, *args, **options):
|
|
def execute(self, *args, **options):
|
|
self.stdin = options.get('stdin', sys.stdin)
|
|
self.stdin = options.get('stdin', sys.stdin)
|
|
@@ -75,8 +92,8 @@ class Command(BaseCommand):
|
|
user_data[PASSWORD_FIELD] = None
|
|
user_data[PASSWORD_FIELD] = None
|
|
try:
|
|
try:
|
|
if options['interactive']:
|
|
if options['interactive']:
|
|
-
|
|
+
|
|
-
|
|
+
|
|
fake_user_data = {}
|
|
fake_user_data = {}
|
|
if hasattr(self.stdin, 'isatty') and not self.stdin.isatty():
|
|
if hasattr(self.stdin, 'isatty') and not self.stdin.isatty():
|
|
raise NotRunningInTTYException
|
|
raise NotRunningInTTYException
|
|
@@ -111,10 +128,17 @@ class Command(BaseCommand):
|
|
message = self._get_input_message(field)
|
|
message = self._get_input_message(field)
|
|
input_value = self.get_input_data(field, message)
|
|
input_value = self.get_input_data(field, message)
|
|
user_data[field_name] = input_value
|
|
user_data[field_name] = input_value
|
|
- fake_user_data[field_name] = input_value
|
|
+ if field.many_to_many and input_value:
|
|
|
|
+ if not input_value.strip():
|
|
|
|
+ user_data[field_name] = None
|
|
|
|
+ self.stderr.write('Error: This field cannot be blank.')
|
|
|
|
+ continue
|
|
|
|
+ user_data[field_name] = [pk.strip() for pk in input_value.split(',')]
|
|
|
|
+ if not field.many_to_many:
|
|
|
|
+ fake_user_data[field_name] = input_value
|
|
|
|
|
|
|
|
|
|
- if field.remote_field:
|
|
+ if field.many_to_one:
|
|
fake_user_data[field_name] = field.remote_field.model(input_value)
|
|
fake_user_data[field_name] = field.remote_field.model(input_value)
|
|
|
|
|
|
|
|
|
|
@@ -199,7 +223,7 @@ class Command(BaseCommand):
|
|
" (leave blank to use '%s')" % default if default else '',
|
|
" (leave blank to use '%s')" % default if default else '',
|
|
' (%s.%s)' % (
|
|
' (%s.%s)' % (
|
|
field.remote_field.model._meta.object_name,
|
|
field.remote_field.model._meta.object_name,
|
|
- field.remote_field.field_name,
|
|
+ field.m2m_target_field_name() if field.many_to_many else field.remote_field.field_name,
|
|
) if field.remote_field else '',
|
|
) if field.remote_field else '',
|
|
)
|
|
)
|
|
|
|
|