自定义django-admin命令
By - C灵C
在需要自定义命令的应用下面创建Python Package,名为management,
在management下再次创建Python Package,名为commands。
例:apps/cscom(应用名称)/management/commands。
在commands下创建两个Python File,_private.py和deactivate.py,
这里要注意,由于_private.py以下划线开头,将不能用作管理命令去使用,
并且要保证management和commands两个文件夹都有__init__.py文件,
否则将不能检测到自定义的命令。
项目结构如下图所示:
在deactivate.py文件中编写具体的命令,其中必须定义一个Command类并且继承BaseCommand类,或其子类。详细代码如下:
from django.core.management.base import BaseCommand, CommandError
from apps.mail.models import User
class Command(BaseCommand):
help = '更改用户激活状态为False'
def add_arguments(self, parser):
parser.add_argument('user_id', nargs='+', type=int)
def handle(self, *args, **options):
for user_id in options['user_id']:
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
raise CommandError('User "%s" does not exist' % user_id)
# 更改用户的激活状态
user.is_active = False
user.save()
self.stdout.write(self.style.SUCCESS('Successfully change user activation status to false "%s"' % user_id))
每一个自定义的命令,都要自己实现handle()方法,这个方法是命令的核心业务处理代码,你的命令功能要通过它来实现。而add_arguments()则用于帮助处理命令行的参数,如果没有参数,可以不写这个方法。
如果我们在使用管理命令并希望提供控制台输出时,应该写到self.stdout和self.stderr,而不能直接打印到stdout和stderr。另外,我们不需要在消息的末尾加上换行符,它会被自动添加,除非我们指定ending参数:self.stdout.write("Unterminated line", ending='')
接下来就可以在控制台通过python manage.py 自定义命令名 需要传入的参数来执行命令,例:python manage.py deactivate 1。就可将用户置为未激活状态。
文章评论