自定义django-admin命令
我们可以通过manage.py编写和注册自定义的命令。
自定义的管理命令对于独立脚本非常有用,特别是那些使用Linux的crontab服务,或者Windows的调度任务执行的脚本。比如,你有个需求,需要定时清空某篇文章下面的评论,一种解决方案就是写一个django-admin命令,再写一个运行该命令的独立脚本,最后通过crontab服务,定时执行该脚本。
下面,我们将为教程最开始的第一个Django应用中的polls应用编写一个自定义的closepoll命令。
一、创建management/commands目录
首先,需向该应用添加一个management/commands目录。
Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。也就是说,你每自定义一个命令,就要在目录下创建一个新的模块。
像这样:
polls/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
_private.py
closepoll.py
tests.py
views.py
在Python 2上,请确保management和management/commands两个目录都包含__init__.py文件,否则将检测不到你的命令。
在这个例子中,closepoll命令对任何项目都可用,只要它们的INSTALLED_APPS里包含polls应用。
_private.py因为以下划线开头,将不可以作为一个管理命令使用。
在closepoll.py模块中只有一个要求:必须定义一个Command类并继承BaseCommand类或其子类。
二、编写命令的具体代码
要实现这个命令,在polls/management/commands/closepoll.py中添加代码如下:
from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll class Command(BaseCommand):
help = '关闭指定问卷的投票功能' 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(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))
每一个自定义的命令,都要自己实现handle()方法,这个方法是命令的核心业务处理代码,你的命令功能要通过它来实现。而add_arguments()则用于帮助处理命令行的参数,如果没有参数,可以不写这个方法。
注意:当你使用管理命令并希望提供控制台输出时,你应该写到self.stdout和self.stderr,而不能直接打印到stdout和stderr。另外,你不需要在消息的末尾加上换行符,它将被自动添加,除非你指定ending参数:self.stdout.write("Unterminated line", ending='')
三、执行命令的方式
调用格式:python manage.py 自定义命令名 <参数列表>
可以使用python manage.py closepoll <poll_id>调用上面的自定义命令。
四、可选参数
通过接收额外的命令行选项,可以简单地修改closepoll来删除一个给定的poll而不是关闭它。这些自定义的选项可以像下面这样添加到add_arguments()方法中:
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()
# ...
自定义django-admin命令的更多相关文章
- 自定义 Django admin 组件
摘要:学习 Django admin 组件,仿照源码的逻辑,自定义了一个简易的 stark 组件,实现类似 admin 的功能. 可自动生成 url 路由,对于model 有与之相应的配置类对象,可进 ...
- 自定义django admin及其界面
1.在项目目录下新创建一个app,命名为kingadmin,在templates目录下新建kingadmin目录,用来存放相关页面的模板文件,新建一个templatetags目录,用来存放处理前端模板 ...
- 自定义Django Admin界面
目录 模型 注册模型 定制页面 模型 # app/model.py class Question(models.Model): question_text = models.CharField(max ...
- Django admin 自定义Choice_field
在使用Django Admin后台时,有时候想自定义某一字段的Choice_field,例如屏蔽某些选项,只显示某些指定的选项. 想象这样的应用场景,我有一个网站,导航栏是这样的: 点开“技术杂谈”后 ...
- django admin自定义
django admin自定义 class CustomerAdmin(admin.ModelAdmin): list_display = ('id','name','qq','consultant' ...
- Django编写自定义manage.py 命令
官网文档地址:编写自定义 django-admin 命令 金句: 你所浪费的今天,正是昨天死的人所期待的明天. 开篇话: python manage.py <command> 的命令我们用 ...
- Django admin 权威指南(一)
版本: Django 1.10 此部分由官方文档<6.5.1 The Django admin site>翻译而来. 6.5.1.1 概览 默认情况下,使用startproject的时候, ...
- django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)
Django admin 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
- DJANGO ADMIN 一些有用的设置(转)
DJANGO ADMIN 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
- django admin 使用
Django admin 中一些常用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索 ...
随机推荐
- PHP创建socket服务
PHP可以创建socket服务. 先熟悉几个php网络方面的函数,操作手册地址 http://php.net/manual/zh/ref.sockets.php 简单介绍下socket,它表示套接字 ...
- kafka模型理解
1.消息发送至一个topic,而这个topic可以由多个partition组成,每条消息在partition中的位置称为offset 2.消息存在有效期,如果设置为2天,则消息2天后会被删除 3.每个 ...
- Pessimistic and Optimistic locking
事务隔离通常通过锁定任何对事务中资源的访问来实现的.总的来说,有两种方法针对事务的锁定:乐观锁(Pessimistic locking)和悲观锁(Optimistic locking) 悲观锁(Pes ...
- JMX,Jstatd做好JVM应用上线的最后一层保障
目录 我理解的监控 代码异常监控 远程主机配置jmx 修改要启动的java程序启动参数(JVM_OPTS). 修改文件权限 启动jvisualvm 监控服务器上的java程序 jstatd 连接到远程 ...
- c++入门之内置数组和array比较
array是C++11中新提出来的容器类型,与内置数组相比,array是一种更容易使用,更加安全的数组类型,可以用来替代内置数组.作为数组的升级版,继承了数组最基本的特性,也融入了很多容器操作,下面介 ...
- Misha, Grisha and Underground CodeForces - 832D (倍增树上求LCA)
Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...
- static特别用法【静态导包】——Java包的静态导入
面试我问你static关键字有哪些作用,如果你答出static修饰变量.修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热 ...
- 使用 Drools 和 JPA & Drools show case in docker hub
使用 Drools 和 JPA 实现持续的实时数据分析https://www.ibm.com/developerworks/cn/java/j-drools5/index.html Drools - ...
- python 3.6.1 安装scrapy踩坑之旅
系统环境:win10 64位系统安装 python基础环境配置不做过多的介绍 window环境安装scrapy需要依赖pywin32,下载对应python版本的exe文件执行安装,下载的pywin32 ...
- oracle创建表空间、创建用户、授权角色和导入导出用户数据
使用数据库管理员身份登录 -- log as sysdba sqlplus / as sysdba; 创建临时表空间 -- create temporary tablespace create tem ...