Пользовательские команды Django-Admin - AttributeError: «Команда» Объект не имеет атрибута 'stdout'

StackOverflow https://stackoverflow.com/questions/3167795

  •  02-10-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

Поскольку это первый удар в Google, я напишу еще одно решение другому задачу с тем же сообщением об ошибке: если ваша команда класса реализует __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

Здесь есть два простых решения. Простой, чтобы просто преобразовать все ваши self.stdout Линии к print заявления вместо этого.

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

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

Итак вместо:

Command().handle()

Делать:

Command().execute()

Это настроит self.stdout Переменная правильно, и вы будете выключены и запущены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top