问题描述
我正在尝试根据用户的状态创建用户活动流。
I am trying to create activity streams of users from their status.
模型:
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)
但是,尽管我创建了新状态,但并没有创建新状态来自 post_save
信号。
However, although I create a new status, it does not create a new activity from the post_save
signal.
信号:
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)
我在做什么错?请帮我解决这个问题。我将非常感谢。谢谢。
What am I doing wrong? Please help me solve this problem. I will be very much grateful. Thank you.
更新:
但是这样做会创建活动:
However doing like this creates the activity:
@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
)
为什么上述方法不起作用?
Why doesn't the above works then?
推荐答案
似乎未执行您的 post_save.connect
。您应该在某处导入 signals
。对于django 1.7,建议在应用程序的config ready()函数中执行此操作。阅读
Seems like your post_save.connect
is not executed. You should import signals
somewhere. For django 1.7 it is recommended to do this in the app's config ready() function. Read the "Where should this code live?" side note in the docs.
例如,如果您的应用名为活动
:
For example if your app is called activity
:
activity / __ init __。py
default_app_config = 'activity.apps.ActivityAppConfig'
activity / apps.py
from django.apps import AppConfig
class ActivityAppConfig(AppConfig):
name = 'activity'
def ready(self):
import activity.signals
别忘了添加到您的 connect()
调用:
And don't forget to add dispatch_uid to your connect()
call:
post_save.connect(create_activity_item, sender=Status,
dispatch_uid="create_activity_item")
UPDATE :
属性始终为小写。因此,应将 ContentType
的name if
语句更改为:
UPDATE: name
attribute of ContentType
is always in lower case. So you should change the if
statement to:
if ctype.name == 'status':
这篇关于django-信号不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!