向自定义 Django management/manage.py 命令添加确认步骤

Add confirmation step to custom Django management/manage.py command

我在 this tutorial 之后创建了以下自定义管理命令。

from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User

from topspots.models import Notification


class Command(BaseCommand):
    help = 'Sends message to all users'

    def add_arguments(self, parser):
        parser.add_argument('message', nargs='?')

    def handle(self, *args, **options):
        message = options['message']
        users = User.objects.all()
        for user in users:
            Notification.objects.create(message=message, recipient=user)

        self.stdout.write(
            self.style.SUCCESS(
                'Message:\n\n%s\n\nsent to %d users' % (message, len(users))
            )
        )

它完全符合我的要求,但我想添加一个确认步骤,以便在 for user in users: 循环之前询问您是否真的要将消息 X 发送给 N 个用户,并且如果选择 "no",命令将中止。

我认为这可以很容易地完成,因为它会发生在一些内置的管理命令中,但它似乎没有在教程中涵盖这一点,甚至在搜索和查看内置管理命令的源代码之后也是如此-在管理命令中,我自己无法弄清楚。

您可以使用Python的raw_input/input功能。这是 Django 的 source code:

中的示例方法
from django.utils.six.moves import input

def boolean_input(question, default=None):
    result = input("%s " % question)
    if not result and default is not None:
        return default
    while len(result) < 1 or result[0].lower() not in "yn":
        result = input("Please answer yes or no: ")
    return result[0].lower() == "y"

如果您的代码应该与 Python 2 和 3 兼容,请务必使用来自 django.utils.six.moves 的导入,或者如果您使用 Python,请使用 raw_input() 2. input() on Python 2 将评估输入而不是将其转换为字符串。