Ошибка Django: у объекта «Сигнал» нет атрибута «сохранить» - PullRequest
0 голосов
/ 17 июля 2010

Я боролся с этой проблемой в течение 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 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 ]

1 голос
/ 17 июля 2010

Ваша главная проблема в дисциплине в поддержании стиля кодирования, или, скорее, в этом случае, в отсутствии. Вы обнаружите, что легче выявить проблемы в вашем коде, если вы не используете одно и то же имя для ссылки на несколько вещей в одном модуле; дать каждому объекту уникальное, значимое имя и ссылаться на него, используя только это имя.

0 голосов
/ 17 июля 2010

Суть в том, что документы для этого проекта содержат неверный код.Эта строка:

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

никогда не будет работать.from actstream import action в конечном итоге импортирует сигнал из actstream.signals, а у сигналов нет и никогда не было метода save.Особенно не с такой странной подписью sender, verb.

Сначала я подумал, что, возможно, автор сделал что-то странное с подклассом Signal, но, посмотрев на остальную часть кодовой базы, это не тот случай.Я не совсем уверен, каково было намерение этих документов, но в вашем обработчике правильно будет либо сохранить новый экземпляр Action (импортированный из actstream.models), либо сделать что-то сваша модель.

К сожалению, в репозитории проекта есть довольно печальный набор тестов / примеров, поэтому, не загружая и не пробуя приложение самостоятельно, я не могу сказать вам, что должно произойти там.Вы можете попытаться связаться с автором или просто найти лучшее документированное / поддерживаемое приложение Activity Streams.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...