django - signaux ne fonctionne pas
Je suis en train de créer les flux de l'activité des utilisateurs à partir de leur statut.
modèles:
class Status(models.Model):
body = models.TextField(max_length=200)
image = models.ImageField(blank=True, null=True, upload_to=get_upload_file_name)
privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
user = models.ForeignKey(User)
class Activity(models.Model):
actor = models.ForeignKey(User)
action = models.CharField(max_length=100)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
Cependant, même si je créer un nouveau statut, il ne crée pas une nouvelle activité à partir de la post_save
signal.
signaux:
from django.contrib.contenttypes.models import ContentType
from django.db.models.signals import post_save
from status.models import Status
from models import Activity
def create_activity_item(sender, instance, signal, *args, **kwargs):
if kwargs.get('created', True):
ctype = ContentType.objects.get_for_model(instance)
if ctype.name == 'Status':
action = ' shared '
activity = Activity.objects.get_or_create(
actor = instance.user,
action = action,
content_type = ctype,
object_id = instance.id,
pub_date = instance.pubdate
)
post_save.connect(create_activity_item, sender=Status)
Ce que je fais mal? Merci de m'aider à résoudre ce problème. Je serai très reconnaissant. Merci.
Mise à jour:
Toutefois faire comme il s'en crée de l'activité:
@receiver(post_save, sender=Status)
def create(sender, instance, **kwargs):
if kwargs.get('created',True):
ctype = ContentType.objects.get_for_model(instance)
activity = Activity.objects.get_or_create(
actor = instance.user,
action = ' shared ',
content_type = ctype,
object_id = instance.id,
pub_date = instance.pub_date
)
Pourquoi ne pas les travaux ci-dessus alors?
Vous devez vous connecter pour publier un commentaire.
Semble que votre
post_save.connect
n'est pas exécutée. Vous devez importersignals
quelque part. Pour django 1.7 il est recommandé de le faire dans l'application de configuration de prêt() fonction. Lire la "Où mettre ce code en direct?" note de côté dans les docs.Par exemple, si votre application est appelée
activity
:activity/__init__.py
activity/apps.py
Et n'oubliez pas d'ajouter dispatch_uid à votre
connect()
appel:Mise à JOUR:
name
attribut deContentType
est toujours en minuscules. Donc, vous devriez changer leif
déclaration:__init__.py
j'ai ajoutédefault_app_config = 'activities.apps.ActivityAppConfig'
que des activités est le nom de l'application. Et puis ajouté un nouveau apps.py fichier dans l'application tout en changeant le nom de domaine deActivityAppConfig
à des "activités". Puis ajouterdispatch_uid
.apps.py
est recommandé dans les docs officielles, mais pas obligatoire. Par exemple, vous pouvezimport signals
dansapp/__init__.py
. BTW, je préfère définir/connecter des signaux de droit dans lemodels.py
🙂Sans toucher apps.py cela a fonctionné pour moi.
et les signaux crochet,