2010-07-17 51 views
-1

我一直在爲這個問題奮鬥了5個小時,我感覺這是一個簡單的解決方案,我只是俯瞰。Django錯誤'信號'對象沒有'保存'屬性

我試圖綁定第三方模塊(Django Activity Stream),它使用一系列發送者和接收者將關於用戶活動的數據發佈到數據庫表。一切都設置正確,但我嘗試運行時遇到了一個'Signal' Object has No Attribute 'Save'錯誤。

我懷疑問題出在我的語法某處。我剛剛開始使用Signals,所以我可能會忽略一些經驗豐富的老手。

views.py我:

from django.db.models.signals import pre_save 
from actstream import action ##This is the third-party app 
from models import Bird 

def my_handler(sender, **kwargs): 
action.save(sender, verb='was saved') 
#return HttpResponse("Working Great") 

pre_save.connect(my_handler, sender=Bird) 

def animal(request): 
animal = Bird() 
animal.name = "Douglas" 
animal.save() 

Django的活動流應用程序有此signals.py文件:

from django.dispatch import Signal 

action = Signal(providing_args=['actor','verb','target','description','timestamp']) 

,然後將此models.py文件:

from datetime import datetime 
from operator import or_ 
from django.db import models 
from django.db.models.query import QuerySet 
from django.core.urlresolvers import reverse 
from django.utils.translation import ugettext_lazy as _ 
from django.utils.timesince import timesince as timesince_ 
from django.contrib.contenttypes import generic 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth.models import User 
from actstream import action 
... 
def action_handler(verb, target=None, **kwargs): 
    actor = kwargs.pop('sender') 
    kwargs.pop('signal', None) 
    action = Action(actor_content_type=ContentType.objects.get_for_model(actor), 
        actor_object_id=actor.pk, 
        verb=unicode(verb), 
        public=bool(kwargs.pop('public', True)), 
        description=kwargs.pop('description', None), 
        timestamp=kwargs.pop('timestamp', datetime.now())) 
    if target: 
     action.target_object_id=target.pk 
     action.target_content_type=ContentType.objects.get_for_model(target) 

    action.save() 

action.connect(action_handler, dispatch_uid="actstream.models") 

回答

0

這裏的底線是該項目的文檔包含錯誤的代碼。此行:

action.save(sender, verb='was saved') 

不會工作。 from actstream import action最終從actstream.signals中導入信號,並且信號不會也不會有方法。特別是沒有這種sender, verb的奇怪簽名。

起初我想也許作者在Signal的子類中做了一些奇怪的事情,但是在查看代碼庫的其餘部分之後,情況並非如此。我不完全確定這些文檔的意圖應該是什麼,但在您的處理程序中正確的做法是保存新的Action(從actstream.models導入)實例,或者對您的模型執行某些操作。

不幸的是,該項目的存儲庫有一個非常抱歉的測試/例子集,所以如果沒有自己下載和嘗試應用程序,我不能告訴你需要在那裏發生什麼。您可以嘗試聯繫作者,或者嘗試查找更好的文檔/更好維護的Activity Streams應用程序。

+0

感謝您的回答。我正在考慮自己寫這個應用程序,但後來發現我認爲是一個很好的捷徑。無論如何,看起來我最終會自行寫作。我想這就是我試圖偷工減料的結果!再次感謝您的明確迴應。 – 2010-07-17 13:12:41

1

你的主要問題是在維護編碼風格的學科中,或者說ra在這種情況下,缺乏。您會發現,如果您不使用相同的名稱來引用同一模塊中的多個內容,則可以更輕鬆地識別代碼中的問題;爲每個對象指定一個唯一的,有意義的名稱,並僅使用該名稱引用它。

+0

我不會認爲編碼風格是混亂的,但問題實際上源於OP選擇使用的應用程序的文檔。引發AttributeError的代碼行逐字從文檔複製,並且由於原始作者的應用程序而顯然是錯誤的。 – 2010-07-17 06:55:26

相關問題