カスタム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
5月にコミットされた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
ここには2つの簡単な解決策があります。簡単なのは、すべてのすべてを単純に変換することです self.stdout
行 print
代わりにステートメント。
それはOKソリューションであり、あなたはそれをすることができます。
それ以来、より良い解決策 self.stdout
でセットアップされています execute()
方法は、...実行することです execute()
方法。
だから:の代わりに:
Command().handle()
行う:
Command().execute()
それがセットアップされます self.stdout
変数は正しく、オフとランニングを行うことになります。
所属していません StackOverflow