J'essaie de créer des flux d'activité d'utilisateurs à partir de leur statut.
des 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, bien que je crée un nouveau statut, cela ne crée pas une nouvelle activité à partir du signal post_save
.
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)
Qu'est-ce que je fais mal? S'il vous plaît aidez-moi à résoudre ce problème. Je vous en serai très reconnaissant. Je vous remercie.
Mettre à jour:
Cependant, cela crée l'activité suivante:
@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 ce qui précède ne fonctionne-t-il pas alors?
On dirait que votre post_save.connect
n'est pas exécuté. Vous devriez importer signals
quelque part. Pour Django 1.7, il est recommandé de le faire dans la fonction config ready () de l'application. Lisez le "Où ce code devrait-il vivre?" note latérale dans la documentation.
Par exemple, si votre application s'appelle activity
:
activité/__ init__.py
default_app_config = 'activity.apps.ActivityAppConfig'
activité/apps.py
from Django.apps import AppConfig
class ActivityAppConfig(AppConfig):
name = 'activity'
def ready(self):
import activity.signals
Et n'oubliez pas d'ajouter dispatch_uid à votre appel connect()
:
post_save.connect(create_activity_item, sender=Status,
dispatch_uid="create_activity_item")
UPDATE: name
L'attribut de ContentType
est toujours en minuscule. Donc, vous devriez changer l'instruction if
en:
if ctype.name == 'status':
Sans toucher apps.py cela a fonctionné pour moi.
class MyModel(models.Model):
""" MyModel fields go """
body = models.TextField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
def post_save_actions(sender, instance, created, **kwargs):
if created:
# post save actions if new instance is created,
# do something with `instance` or another models
# be careful about circular imports. \m/
et les signaux accrochent,
post_save.connect(post_save_user_actions, sender=MyModel)