-1

我已经为这个问题苦苦挣扎了 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") 
4

2 回答 2

1

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

于 2010-07-17T05:57:07.460 回答
0

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

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

永远不会工作。最终from actstream import action从 actstream.signals 导入一个信号,而信号没有也从来没有一个save方法。尤其是没有这种奇怪的签名sender, verb

起初我以为作者对 Signal 的子类化做了一些奇怪的事情,但在查看了代码库的其余部分之后,情况并非如此。我不完全确定这些文档的意图是什么,但是在您的处理程序中做的正确事情是保存一个新的Action(从 导入actstream.models)实例,或者对您的模型做一些事情。

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

于 2010-07-17T06:51:51.403 回答