benutzerdefinierte django-admin-Befehle - Attribute: ‚Befehl‘ Objekt kein Attribut ‚stdout‘ hat
-
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
mitLö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.