4

this tutorialの次のカスタム管理コマンドを作成しました。カスタムDjango管理/ manage.pyコマンドに確認手順を追加

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)) 
      ) 
     ) 

私はそれがしたいとそれが正確に動作しますが、あなたが本当にNのユーザーにメッセージXを送信したい場合、私はfor user in users:ループの前に、あなたが尋ねているように、確認ステップを追加したい、とコマンドがあります「いいえ」を選択した場合は中止されます。

これは簡単に行うことができますが、これは組み込みの管理コマンドで発生するためですが、チュートリアルや組み込みの管理コマンドのソースを調べてもそれをカバーしていないようです。管理コマンドでは、私自身でそれを理解することができませんでした。

+0

入力を求めるのは単なる基本的なpythonです。 Djangoのソースコードの例は、[here](https://github.com/django/django/blob/59afe61a970dd60df388e7cda9041ef3c0e770cb/django/db/migrations/questioner.py#L87)にあります。 – knbk

+0

まあまあ。 'input()'は私が最初に試したことですが、私が作ったに違いないミスのために初めて試してみました。それは私が探しているようです。ありがとうございました。答えとして投稿してください、私はそれを受け入れます! – elethan

答えて

5

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 2上のPython 2 input()にしている場合raw_input()を使用します入力を文字列に変換するのではなく、評価します。

関連する問題