C
T O P
Image

Django

自定义django命令

自定义django-admin命令

  • By - C灵C

  • 2019年5月27日 12:17




在需要自定义命令的应用下面创建Python Package,名为management,

    在management下再次创建Python Package名为commands。

例:apps/cscom(应用名称)/management/commands


commands下创建两个Python File_private.pydeactivate.py

这里要注意,由于_private.py以下划线开头,将不能用作管理命令去使用,

并且要保证managementcommands两个文件夹都有__init__.py文件,

否则将不能检测到自定义的命令。

项目结构如下图所示:

admin.png

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。就可将用户置为未激活状态。