カスタム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 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.stdoutprint 代わりにステートメント。

それはOKソリューションであり、あなたはそれをすることができます。

それ以来、より良い解決策 self.stdout でセットアップされています execute() 方法は、...実行することです execute() 方法。

だから:の代わりに:

Command().handle()

行う:

Command().execute()

それがセットアップされます self.stdout 変数は正しく、オフとランニングを行うことになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top