2010-07-17 14 views
-1

J'ai lutté avec ce problème pendant 5 heures et j'ai l'impression que c'est une solution simple que je suis juste en train de négliger. J'essaie de lier un module tiers (Django Activity Stream) qui utilise une série d'expéditeurs et de récepteurs pour publier des données sur l'activité de l'utilisateur dans une table de base de données. Tout est configuré et installé correctement, mais j'obtiens une erreur 'Signal' Object has No Attribute 'Save' lorsque j'essaie de l'exécuter. Je suspecte que le problème est dans ma syntaxe quelque part. Je ne fais que commencer avec les Signaux, alors je suis probablement en train de négliger quelque chose qu'un vétéran verra immédiatement.Erreur Django L'objet 'Signal' n'a pas d'attribut 'enregistrer'

En views.py je:

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() 

L'application Activity Django flux a ce fichier signals.py:

from django.dispatch import Signal 

action = Signal(providing_args=['actor','verb','target','description','timestamp']) 

Et puis ce fichier 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") 

Répondre

0

En bout de ligne, les documents de ce projet contiennent du code erroné. Cette ligne:

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

ne marchera jamais. Le from actstream import action importe finalement un signal de actstream.signals, et les signaux n'ont pas et n'ont jamais eu une méthode save. Surtout pas avec une telle signature étrange de sender, verb. Au début, je pensais que peut-être l'auteur avait fait quelque chose d'étrange avec le sous-classement Signal, mais après avoir regardé le reste de la base de code, ce n'est tout simplement pas le cas. Je ne suis pas tout à fait sûr de ce que l'intention de ces documents était censé être, mais la bonne chose à faire dans votre gestionnaire sera soit d'enregistrer une nouvelle instance (actstream.models), soit de faire quelque chose avec votre modèle. Malheureusement, le référentiel du projet a un ensemble désastreux de tests/exemples, donc sans télécharger et essayer l'application moi-même, je ne peux pas vous dire ce qui doit s'y passer. Vous pouvez essayer de contacter l'auteur ou simplement essayer de trouver une application Activity Streams mieux documentée/mieux gérée.

+0

Merci pour la réponse. Je pensais écrire cette application moi-même, mais j'ai ensuite trouvé ce que je pensais être un excellent raccourci. On dirait que je vais finir par l'écrire tout seul. Je suppose que c'est ce que j'ai pour essayer de couper les coins! Merci encore pour votre réponse claire. –

1

Votre principal problème est dans la discipline dans le maintien du style de codage, ou ra ther dans ce cas, le manque de. Vous trouverez qu'il est plus facile d'identifier les problèmes dans votre code si vous n'utilisez pas le même nom pour faire référence à plusieurs choses dans le même module; donner à chaque objet un nom unique et significatif et s'y référer en utilisant uniquement ce nom.

+0

Je ne vais pas prétendre que le style de codage est désordonné, mais le problème provient en fait des docs de l'application que l'OP a choisi d'utiliser. Les lignes de code qui déclenchent l'attribut AttributeError sont copiées textuellement des docs et sont tout simplement fausses grâce à l'auteur original de l'application. –