Пользовательские команды Django-Admin - AttributeError: «Команда» Объект не имеет атрибута 'stdout'
-
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
Переменная правильно, и вы будете выключены и запущены.