2010-07-02 52 views
2

繼編寫定製Django的管理命令here的例子中,我創建了以下自定義命令:定製Django的管理命令 - AttributeError的:「命令」對象有沒有屬性「標準輸出」

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

回答

4

它看起來像映射self.stdout是Django的主幹版本很新的變化,致力於在五月。如果您正在運行1.2版本或更早的版本,這將無法正常工作 - 您應該使用the earlier documentation

+0

我正在運行django 1.2.1,所以仍然需要一個答案。將更新問題。 – Jonathan 2010-07-02 19:00:09

+0

我不知道爲什麼我的答案不令人滿意。 Django 1.2.1於5月24日發佈,此更改於6月6日發佈。 – 2010-07-02 19:22:43

+1

@Jonathan:將「self.stdout.write」替換爲「print」。 @丹尼爾我認爲你的答案會從提到實際修復中受益。但+1,因爲它幫助我解決了我的問題:) – 2010-10-15 16:29:57

9

由於這是Google上的第一次打擊,我會針對另一個問題編寫另一個解決方案,並提供相同的錯誤消息: 如果您的類Command執行__init__,則必須調用超類的__init__。

這將工作:

​​

這是行不通的:

from django.core.management.base import BaseCommand 

class Command(BaseCommand): 

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

這不適用於我... – 2016-08-15 12:43:00

+0

這對我有效,現在的正確答案現在太老了 – maxicecilia 2017-12-10 21:41:50

4

有兩個簡單的解決方案在這裏。簡單的方法是簡單地將所有self.stdout行轉換爲print語句。

這是一個很好的解決方案,你可以做到這一點。

更好的解決方案,因爲在​​方法中設置了self.stdout,所以要...運行​​方法。

所以不是:

Command().handle() 

務必:

Command().execute() 

這會正確設置self.stdout變量,你會關閉和運行。

+0

這個答案應該選爲hte最佳答案! – wei 2014-12-16 15:23:24

+0

感謝您的建議。 任何人都可以確認句柄和執行之間是否存在真正的區別?我剛剛改變了我的句柄定義來執行,我得到了期望的結果。但很少有人擔心使用句柄代替執行的實際好處。 – just10minutes 2016-12-28 09:53:14

相關問題