Following the example of writing a custom django-admin command here, I've created the following custom command:
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!")
Surprisingly, I receive the following 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'
How come? This is a very basic custom command that as far as I understand conforms to the example.
I'm using django 1.2.1
It looks like the mapping to
self.stdout
is a very new change in Django's trunk version, committed in May. If you're running the 1.2 release or earlier, this won't work - and you should be using the earlier documentation.There are two easy solutions here. The simple one is to simply convert all of your
self.stdout
lines toprint
statements instead.That's an OK solution and you can do it.
The better solution, since
self.stdout
is set up in theexecute()
method, is to...run theexecute()
method.So instead of:
Do:
That'll set up the
self.stdout
variable correctly and you'll be off and running.Since this is the first hit on Google I'll write another solution to another problem with the same error message: If your class Command implements __init__, it has to call __init__ of the superclass.
This will work:
This won't work: