2010-07-17 3 views
-1

Я боролся с этой проблемой в течение 5 часов, и у меня есть ощущение, что это простое решение, которое я просто просматриваю.Объект «Сигнал» Django не имеет атрибута «save»

Я пытаюсь связать сторонний модуль (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") 

ответ

0

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

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

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

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

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

+0

Спасибо за ответ. Я сам подумывал о написании этого приложения, но потом нашел то, что, по моему мнению, было отличным ярлыком. Похоже, я все равно напишу его самостоятельно. Наверное, это то, что я получаю от попыток срезать углы! Еще раз спасибо за ваш четкий ответ. –

1

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

+0

Я не буду утверждать, что стиль кодирования грязный, но проблема на самом деле связана с документами приложения, которое OP выбрал для использования. Строки кода, которые поднимают атрибут AttributeError, копируются дословно из документов и просто неправильны благодаря оригинальному автору приложения. –

Смежные вопросы