Django错误'Signal'对象没有属性'save'

时间:2010-07-17 05:14:36

标签: django signals dispatcher

我一直在努力解决这个问题5个小时,我觉得这是一个简单的解决方案,我只是忽略了。

我正在尝试绑定第三方模块(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 Activity Stream应用程序有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") 

2 个答案:

答案 0 :(得分:1)

你的主要问题在于维护编码风格的学科,或者更确切地说,在这种情况下缺乏编码风格。您会发现,如果您不使用相同的名称来引用同一模块中的多个内容,则更容易识别代码中的问题;给每个对象一个唯一的,有意义的名称,并仅使用该名称引用它。

答案 1 :(得分:0)

这里的底线是该项目的文档包含错误的代码。这一行:

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

永远不会起作用。 from actstream import action最终会从actstream.signals导入一个信号,而信号则没有,也从来没有save方法。特别是没有sender, verb的奇怪签名。

起初我想也许作者在继承Signal时做了一些奇怪的事情,但在查看其余的代码库后,情况并非如此。我不完全确定这些文档的意图应该是什么,但在处理程序中正确的做法是保存新的Action(从actstream.models导入)实例,或者对你的模特做点什么。

可悲的是,该项目的存储库有一套非常令人遗憾的测试/示例,因此,如果不自行下载和试用该应用程序,我无法告诉您需要在那里发生什么。您可以尝试联系作者,或者只是尝试找到更好记录/更好维护的Activity Streams应用程序。