Django: как ввести новый аргумент BaseCommand - PullRequest
0 голосов
/ 29 февраля 2020

В методе BaseCommand.create_parser () создается набор аргументов по умолчанию и анализируется для всех подклассовых команд. Каков наилучший способ расширить этот метод, добавив дополнительный аргумент?

Один из вариантов воздействия на желаемое поведение - переопределить каждую из доступных команд, расширяя метод add_arguments() (как показано ниже); Я бы предпочел этого избежать, так как это звучит как кошмар обслуживания.

Желаемое поведение

Следующий модуль переопределяет команду print_settings, предоставляемую django -extensions обеспечить добавление нужного аргумента в одну команду. Однако я хочу добавить этот аргумент ко всем командам в моем приложении.

"""Override the ``print_settings`` command provided by ``django-extensions``.

Add support to load a specified config file.

.. module:: odlogging.management.commands.print_settings
   :synopsis: override the ``print_settings`` command provided by ``django-extensions``
"""
# stdlib
import logging
from pathlib import Path
from typing import Any

# django packages
from django.core.management import base

# third party
from django_extensions.management.commands import print_settings

# local
from odlogging.common import config_parse

logger = logging.getLogger(__name__)


class Command(print_settings.Command):
    """Override the ``print_settings`` command to config files."""

    def add_arguments(self, parser: base.CommandParser):
        """Add the ``--config`` argument for specifying the environment configuration.

        :param parser: the parser used for parsing command arguments
        :type parser: base.CommandParser
        """
        super().add_arguments(parser)
        parser.add_argument(
            "--config",
            default=".config.json",
            type=Path,
            help="specify the path to the config file containing environment settings",
        )

    def handle(self, *args: Any, **options: Any):
        """Override the default method to load the specified config file.

        :param options: the arguments parsed from the command line
        :type options: Any
        """
        # execute internal config file handling
        config_parse.load_and_validate_config(options["config"])
        super().handle(*args, **options)

...