tutorial - django-las señales no funcionan
httpresponseredirect django example (2)
Parece que tu post_save.connect
no se ejecuta. Deberías importar signals
algún lugar. Para django 1.7, se recomienda hacer esto en la función config ready () de la aplicación. Lea el "¿Dónde debería vivir este código?" Nota al margen en los documentos.
Por ejemplo, si tu aplicación se llama activity
:
actividad / __ init__.py
default_app_config = ''activity.apps.ActivityAppConfig''
actividad / apps.py
from django.apps import AppConfig
class ActivityAppConfig(AppConfig):
name = ''activity''
def ready(self):
import activity.signals
Y no olvide agregar dispatch_uid a su llamada connect()
:
post_save.connect(create_activity_item, sender=Status,
dispatch_uid="create_activity_item")
ACTUALIZACIÓN : el atributo de name
de ContentType
siempre está en minúscula. Así que deberías cambiar la sentencia if
a:
if ctype.name == ''status'':
Estoy tratando de crear flujos de actividad de los usuarios a partir de su estado.
modelos:
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)
Sin embargo, aunque creo un nuevo estado, no crea una nueva actividad a partir de la señal post_save
.
señales:
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é estoy haciendo mal? Por favor ayudame a resolver este problema. Estaré muy agradecido. Gracias.
Actualizar:
Sin embargo haciendo esto crea la actividad:
@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
)
¿Por qué no funciona lo anterior, entonces?
Sin tocar apps.py esto me funcionó.
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/
y las señales enganchan,
post_save.connect(post_save_user_actions, sender=MyModel)