comandi personalizzati django-admin - AttributeError: oggetto 'comando' non ha alcun attributo 'stdout'
-
02-10-2019 - |
Domanda
Seguendo l'esempio di scrivere un comando personalizzato django-admin qui , ho creato il seguente comando personalizzato:
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!")
Sorprendentemente, ricevo il seguente analisi dello stack:
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'
Come mai? Questo è un comando molto di base personalizzato che, per quanto ho capito è conforme all'esemplare.
sto usando django 1.2.1
Soluzione
Sembra che la mappatura per self.stdout
è un nuovo cambio di versione tronco di Django, impegnata a maggio. Se si sta eseguendo la versione 1.2 o precedenti, questo non funzionerà - e si dovrebbe utilizzare la documentazione precedente .
Altri suggerimenti
Dal momento che questo è il primo colpo su Google scriverò un'altra soluzione a un altro problema con lo stesso messaggio di errore: Se i vostri attrezzi classe di comando __init__, deve chiamare __init__ della superclasse.
Questo lavoro sarà:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
... do stuff
Questo non funziona:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
... do stuff
Ci sono due semplici soluzioni qui. Il semplice è quello di convertire semplicemente tutte le linee self.stdout
alle dichiarazioni print
invece.
Questa è una soluzione su OK e si può fare.
La soluzione migliore, dal momento che self.stdout
è impostato nel metodo execute()
, è quello di eseguire il metodo ... execute()
.
Così, invece di:
Command().handle()
Do:
Command().execute()
Che sarà istituito la variabile self.stdout
correttamente e sarete fuori e in esecuzione.