向自定义 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 将评估输入而不是将其转换为字符串。
我在 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 将评估输入而不是将其转换为字符串。