소스 검색

Fixed #29152 -- Allowed passing kwargs to ArgumentParser initialization in management commands.

humbertotm 6 년 전
부모
커밋
e95008f241
3개의 변경된 파일21개의 추가작업 그리고 1개의 파일을 삭제
  1. 2 1
      django/core/management/base.py
  2. 13 0
      docs/howto/custom-management-commands.txt
  3. 6 0
      tests/user_commands/tests.py

+ 2 - 1
django/core/management/base.py

@@ -244,7 +244,7 @@ class BaseCommand:
         """
         return django.get_version()
 
-    def create_parser(self, prog_name, subcommand):
+    def create_parser(self, prog_name, subcommand, **kwargs):
         """
         Create and return the ``ArgumentParser`` which will be used to
         parse the arguments to this command.
@@ -255,6 +255,7 @@ class BaseCommand:
             formatter_class=DjangoHelpFormatter,
             missing_args_message=getattr(self, 'missing_args_message', None),
             called_from_command_line=getattr(self, '_called_from_command_line', None),
+            **kwargs
         )
         parser.add_argument('--version', action='version', version=self.get_version())
         parser.add_argument(

+ 13 - 0
docs/howto/custom-management-commands.txt

@@ -255,6 +255,19 @@ the :meth:`~BaseCommand.handle` method must be implemented.
                 super().__init__(*args, **kwargs)
                 # ...
 
+.. method:: BaseCommand.create_parser(prog_name, subcommand, **kwargs)
+
+    Returns a ``CommandParser`` instance, which is an
+    :class:`~argparse.ArgumentParser` subclass with a few customizations for
+    Django.
+
+    You can customize the instance by overriding this method and calling
+    ``super()`` with ``kwargs`` of :class:`~argparse.ArgumentParser` parameters.
+
+    .. versionchanged:: 2.2
+
+        ``kwargs`` was added.
+
 .. method:: BaseCommand.add_arguments(parser)
 
     Entry point to add parser arguments to handle command line arguments passed

+ 6 - 0
tests/user_commands/tests.py

@@ -220,6 +220,12 @@ class CommandTests(SimpleTestCase):
         with self.assertRaisesMessage(CommandError, msg):
             management.call_command('subparser', 'test', 12)
 
+    def test_create_parser_kwargs(self):
+        """BaseCommand.create_parser() passes kwargs to CommandParser."""
+        epilog = 'some epilog text'
+        parser = BaseCommand().create_parser('prog_name', 'subcommand', epilog=epilog)
+        self.assertEqual(parser.epilog, epilog)
+
 
 class CommandRunTests(AdminScriptTestCase):
     """