Как использовать опцию команды управления Django? - PullRequest
15 голосов
/ 17 ноября 2010

Документ Django расскажет мне, как добавить опцию в мою команду пользовательского управления django, на примере:

from optparse import make_option

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--delete',
            action='store_true',
            dest='delete',
            default=False,
            help='Delete poll instead of closing it'),
    )

Тогда документы просто остановятся.Как написать метод handle для этого класса, чтобы проверить, предоставил ли пользователь параметр --delete?Время от времени Джанго усложняет легкие вещи: - (

Ответы [ 2 ]

19 голосов
/ 17 ноября 2010

Вы можете сделать это так:

from optparse import make_option

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--del',
            action='store_true',
            help='Delete poll'),
        make_option('--close',
            action='store_true',
            help='Close poll'),
    )

    def handle(self, close, *args, **kwargs):
        del_ = kwargs.get('del')

Обратите внимание, что некоторые ключевые слова в Python зарезервированы, поэтому вы можете обрабатывать те, которые используют **kwargs. В противном случае вы можете использовать обычные аргументы (как я сделал с close)

7 голосов
/ 10 января 2013

Небольшое предложение по определению команд (имя ключа, dest) и обработке значений по умолчанию (в make_option и в команде):

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--del',
            action='store_true',
            help='Delete all polls.',
            dest='your_name_for_delete',
            default=False),
        make_option('--close',
            action='store_true',
            help='Close all polls.'),
    )

    def handle(self, close, *args, **options):
        if options.get('your_name_for_delete'):
            Poll.objects.delete()
        if options.get('close', False):
            Poll.objects.update(closed=True)

В коде Django вы найдете «аргументы ключевых слов» (**kwargs), часто называемые **options, что более наглядно (я придерживаюсь этого соглашения об именах).

Значение по умолчанию может быть указано в make_option или с помощью метода dict.get, который допускает значение по умолчанию.

Нет никаких причин, по которым вы не используете оба значения по умолчанию, если ваш метод Command.handle вызывается вручную, где в словаре **options эта запись может отсутствовать.

...