пользовательские команды django-admin - AttributeError: у объекта 'Command' нет атрибута 'stdout' - PullRequest
2 голосов
/ 02 июля 2010

Следуя примеру написания пользовательской команды 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

Ответы [ 3 ]

12 голосов
/ 09 октября 2013

Поскольку это первое попадание в 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
4 голосов
/ 23 октября 2014

Здесь есть два простых решения.Самый простой - просто конвертировать все ваши self.stdout строки в print операторы.

Это нормальное решение, и вы можете сделать это.

Лучшее решение, поскольку self.stdout настроен в методе execute(), состоит в том, чтобы ... запустить метод execute().

Поэтому вместо:

Command().handle()

Do:

Command().execute()

Это правильно настроит переменную self.stdout, и вы начнете работать.

4 голосов
/ 02 июля 2010

Похоже, что сопоставление с self.stdout - это очень новое изменение в версии ствола Django, совершенное в мае. Если вы используете версию 1.2 или более раннюю, это не сработает - и вы должны использовать более раннюю документацию .

...