我正在尝试从用户的状态创建他们的活动流。
型号:
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
信号创建一个新的活动。
信号:
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)
我做错了什么?请帮我解决这个问题。我会非常感激的。谢谢。
更新日期:
然而,这样做会产生活动:
@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
)
为什么上面的方法行不通呢?
5条答案
按热度按时间kognpnkq1#
看起来你的
post_save.connect
没有被执行。你应该在某个地方导入signals
。对于django 1.7,建议在应用的config ready()函数中导入。请阅读文档中的“此代码应该位于何处?”注解。例如,如果您的应用名为
activity
:活动/初始化.py
活动/apps.py
不要忘记将dispatch_uid添加到
connect()
调用中:UPDATE:
ContentType
的name
属性始终为小写。因此,应将if
语句更改为:2skhul332#
假设您的应用程序名称为
blog
,在settings.py您项目的www.example.com文件中,确保将主项目settings.py文件的INSTALLED_APP变量中的blog
应用程序注册为blog.apps.BlogConfig
,而不仅仅是blog
。iecba09b3#
如果您在
signals.py
中正确写入了所有内容,但无法正常工作,请检查以下步骤...(假设在名为AppName的应用程序中)1.在
__init__.py
中,将行1.在
apps.py
文件中,将块wyyhbhjk4#
不接触apps.py,这对我很有效。
并且信号钩住,
4xy9mtcn5#
简单、可扩展、可重复、可重用的答案是...
如果您计划使用信号(例如:
signals.py
)(例如:posts
),只需养成每次**都将其添加到apps.py
**的习惯。你不需要像其他人说的那样触摸
__init__.py
,你的信号就会起作用。