Django 對於命令的添加有一套規范,你可以為每個app 指定命令。通俗一點講,比如在使用manage.py文件執行命令的時候,可以自定制自己的命令,來實現命令的擴充。
commands的創建
1、在app內創建一個management的python目錄 2、在management目錄里面創建commands的python文件夾 3、在commands文件夾下創建任意py文件
此時py文件名就是你的自定制命令,可以使用下面方式執行
python manage.py 命令名
Django的Command命令是要放在一個app的management/commands目錄下的。
python2環境中,請確保management和management/commands目錄內都包含__init__.py
文件
首先對於文件名沒什么要求,內部需要定義一個Command類並繼承BaseCommand類或其子類。
它必須定義一個Command類並擴展自BaseCommand或其 子類。
其中help是command功能作用簡介,handle函數是主處理程序,add_arguments函數是用來接收可選參數的
from django.core.management.base import BaseCommand, CommandError from polls.models import Poll 自己的 class Command(BaseCommand): help = 'Closes the specified poll for voting' def add_arguments(self, parser): parser.add_argument('poll_id', nargs='+', type=int) def handle(self, *args, **options): for poll_id in options['poll_id']: try: poll = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: raise CommandError('Poll "%s" does not exist' % poll_id) poll.opened = False poll.save() self.stdout.write('Successfully closed poll "%s"' % poll_id)
可選參數
可使用add_argument()方法:
class Command(BaseCommand): def add_arguments(self, parser): # Positional arguments parser.add_argument('poll_id', nargs='+', type=int) # Named (optional) arguments parser.add_argument('--delete', action='store_true', dest='delete', default=False, help='Delete poll instead of closing it') def handle(self, *args, **options): # ... if options['delete']: poll.delete() # ...
帶參數的測試:
# -*- coding: utf-8 -*- # __author__ = 'dandy' from django.core.management.base import BaseCommand class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('aaa', nargs='+', type=int) parser.add_argument('--delete', action='store_true', dest='delete', default=False, help='Delete poll instead of closing it') def handle(self, *args, **options): print('test') print(args, options)
options里面直接取參數就可以了。
方法
返回django版本號:BaseCommand.get_version()
命令的真正邏輯。子類必須實現這個方法。:BaseCommand.handle()
BaseCommand的子類
class LabelCommand
這個管理命令接收命令行上的一個或多個參數(標簽),並對它們每一個都做一些動作。
子類不用實現handle()
,但必須實現handle_label()
,它將會為每個標簽調用一次。
LabelCommand.handle_label(label, **options)
對label完成命令行的動作,label是命令行給出的字符串。