3
1

More than 5 years have passed since last update.

カスタム django-admin コマンドに、独自引数を追加する

Last updated at Posted at 2018-12-13

前回の記事「カスタム django-admin コマンドを実装して、外部からアプリ内のモデルを使う」の続きです。

背景

前回は、カスタムコマンドとして、「crawler」を追加し、$ python manage.py crawlerで、実行できるようにしました。
今回は、そのコマンドに引数を渡して、処理を切り替えられるようにします。

サンプルのコード

  • add_argumentsという関数を実装し、引数の扱い方を指定します。

from django.core.management.base import BaseCommand, CommandError
from app1.models import Topic

class Command(BaseCommand):
  help = 'crawler for test.'

  def add_arguments(self, parser):
    parser.add_argument('-c', '--check-alive', action='store_true', dest='check-alive', help='Check topic alive.')

  def handle(self, *args, **options):
    #self.myprint("options=%s" % options)
    if not options['check-alive']:
      self.crawl_new()
    else:
      self.check_alive()

  def crawl_new(self):
    self.myprint('this is function crawl_new.')

  def check_alive(self):
    self.myprint('this is function check_alive.')

要点

  • 引数は、--versionのように後続の引数が無いものと、--verbosity 3のように後続の引数が有るものの2種類に分けられます。

    • 後続の引数が無い場合は、action='store_true'を指定します。(これの詳しい解説記事が見つからなかった)。引数が指定されたか否かは、True/Falseで格納されます。
    • 後続の引数が有る場合は、nargs='*'を指定します。後続の引数は辞書型で格納されます。後続の引数が省略された場合は、空の辞書が格納されます。
  • さらに、dest='check-alive'で、引数がどのように指定されたかをoptionsにどんなキーで格納するかを指定します。

    • この指定が無いと、引数名の長い方の名前で、-_に変換したキーで格納されます。(上記の例ではoptions['check_alive'])。
    • 引数に長い名前の場合はハイフンを使う場合が多いので、destを指定した方が無難かと思います。

気になる点

  • 上記の場合、-cの代わりに-cc-ccccccccのように同じ文字を重ねて指定しても同じ結果になりますが、-c1のように異なる文字を指定するとerror: argument -c/--check-alive: ignored explicit argument '1'とエラーになります。長い引数の場合は--check-aliveeのように末尾の同じ文字を重ねるとエラーになります。

参考サイト

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1