benutzerdefinierte django-admin-Befehle - Attribute: ‚Befehl‘ Objekt kein Attribut ‚stdout‘ hat

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

  •  02-10-2019
  •  | 
  •  

Frage

Nach dem Vorbild eines benutzerdefinierten django-admin-Befehl schreiben hier , ich habe den folgenden benutzerdefinierten Befehl erstellt:

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!")

Überraschenderweise erhalte ich folgenden Stack-Trace:

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'

Wie kommt das? Dies ist ein sehr einfacher benutzerdefinierter Befehl, soweit ich das entspricht das Exemplar verstehen.

Ich bin django 1.2.1

mit
War es hilfreich?

Lösung

Es sieht aus wie die Abbildung auf self.stdout eine sehr neue Änderung in Django Rüssel-Version ist im Mai begangen. Wenn Sie die Version 1.2 oder früher laufen lassen, das wird nicht funktionieren - und Sie sollten eine href werden mit <= „http://docs.djangoproject.com/en/1.2/howto/custom-management-commands/“ rel = "nofollow noreferrer"> die frühere Dokumentation .

Andere Tipps

Da dies der erste Treffer auf Google I würde eine andere Lösung für ein anderes Problem mit der gleichen Fehlermeldung schreiben: Wenn Ihre Klasse Befehlsgeräte __init__, hat es __init__ der Oberklasse zu nennen.

Dies funktioniert:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def __init__(self, *args, **kwargs):
        super(Command, self).__init__(*args, **kwargs)
        ... do stuff

Das wird nicht funktionieren:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def __init__(self, *args, **kwargs):
       ... do stuff

Es gibt zwei einfache Lösungen hier. Die einfache ist, einfach statt alle Ihre self.stdout Linien print Aussagen zu konvertieren.

Das ist eine OK-Lösung und Sie können es tun.

Die bessere Lösung, da self.stdout in dem execute() Verfahren einzurichten, ist zu ... lief die execute() Methode.

Also statt:

Command().handle()

Sie:

Command().execute()

Das wird die self.stdout Variable richtig eingerichtet und Sie werden ab und läuft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top