-1

私はこの問題に5時間苦労してきましたが、見落としているのは簡単な解決策だと感じています.

一連の送信者と受信者を使用してユーザーアクティビティに関するデータをデータベーステーブルに投稿するサードパーティモジュール ( Django Activity Stream ) を結び付けようとしています。すべてが正しくセットアップおよびインストールされていますが、'Signal' Object has No Attribute 'Save'実行しようとするとエラーが発生します。

問題は構文のどこかにあると思われます。私はシグナルを使い始めたばかりなので、ベテランがすぐに見つけられるものを見落としている可能性があります。

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") 
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 に答える