2

按照此处编写自定义 django-admin 命令的示例,我创建了以下自定义命令:

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

4

3 回答 3

16

由于这是 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
于 2013-10-09T15:40:28.450 回答
4

这里有两个简单的解决方案。最简单的一种是简单地将所有self.stdout行转换为print语句。

这是一个好的解决方案,你可以做到。

更好的解决方案,因为self.stdoutexecute()方法中设置,是...运行execute()方法。

所以而不是:

Command().handle()

做:

Command().execute()

这将正确设置self.stdout变量,您将关闭并运行。

于 2014-10-22T20:24:17.020 回答
4

看起来映射到self.stdout是 Django 主干版本中一个非常新的变化,于 5 月提交。如果您运行的是 1.2 或更早版本,这将不起作用 - 您应该使用更早的文档

于 2010-07-02T18:15:27.550 回答