按照编写自定义django-admin命令here的示例,我创建了以下自定义命令:
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
args = ''
help = 'Test command'
def handle(self, *args, **options):
self.stdout.write("Hello World!")
令人惊讶的是,我收到了以下堆栈跟踪:
Traceback (most recent call last):
File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\manage.py", line 11, in <module>
execute_manager(settings)
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 438, in execute_manager
utility.execute()
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 218, in execute
output = self.handle(*args, **options)
File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\..\dj_project\dj_app\management\commands\mytest.py", line 8, in handle
self.stdout.write("Hello World!")
AttributeError: 'Command' object has no attribute 'stdout'
为什么?这是一个非常基本的自定义命令,据我所知,它符合示例。
我正在使用django 1.2.1
答案 0 :(得分:11)
由于这是Google上的第一个热门话题,我将使用相同的错误消息为另一个问题编写另一个解决方案: 如果你的类Command实现__init__,它必须调用超类的__init__。
这将有效:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
... do stuff
这不起作用:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
... do stuff
答案 1 :(得分:4)
看起来self.stdout
的映射是Django的trunk版本的一个非常新的变化,在5月份提交。如果您正在运行1.2版本或更早版本,则无法运行 - 您应该使用the earlier documentation。
答案 2 :(得分:4)
这里有两个简单的解决方案。简单的一种方法是简单地将所有self.stdout
行转换为print
语句。
这是一个很好的解决方案,你可以做到。
自self.stdout
方法设置execute()
以来,更好的解决方案是...运行execute()
方法。
所以而不是:
Command().handle()
执行:
Command().execute()
即可正确设置self.stdout
变量,您即可关闭并运行。