使用django-activity-stream时遇'property'无'_meta'属性错误
Django Activity Stream 无法指定User为活动发起者的解决方案
问题核心
你错误地将User类或类属性传递给action.send(),但该方法的第一个参数要求传入具体的用户实例,而非类本身。在admin后台创建团队时,需要获取当前执行创建操作的用户实例,再传递给action.send()。
错误原因解析
- 传递
User类:action.send()会将其当作模型实例处理,读取id时拿到的是类的id属性(property对象),而非具体用户的ID值,因此报错Field 'id' expected a number but got '<property object...>'。 - 传递
User.pk:User.pk是类的属性(property类型),既不是模型实例也不是合法的用户ID,actstream无法识别对应的ContentType,因此报错'property' object has no attribute '_meta'。
解决方案
方法1:在Admin类中直接处理(推荐)
通过admin后台创建团队时,直接在Team的Admin类里重写save_model方法,这里能直接获取request.user,无需依赖信号:
# apps/teams/admin.py from django.contrib import admin from .models import Team from actstream import action @admin.register(Team) class TeamAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): # 先保存团队实例 super().save_model(request, obj, form, change) # 仅在创建新团队时记录活动流 if not change: action.send(request.user, verb="创建了团队", target=obj)
方法2:修改信号传递用户实例
如果必须使用post_save信号,可在admin保存时给实例添加临时属性传递用户:
- 修改Team的Admin类:
# apps/teams/admin.py from django.contrib import admin from .models import Team @admin.register(Team) class TeamAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): # 添加临时属性存储创建者用户 obj._created_by = request.user super().save_model(request, obj, form, change)
- 修改signals.py:
# apps/custom_admin/signals.py from actstream import action from django.db.models.signals import post_save from django.dispatch import receiver from apps.teams.models import Team @receiver(post_save, sender=Team) def track_team_created(sender, instance, created, **kwargs): if created and hasattr(instance, '_created_by'): action.send(instance._created_by, verb="创建了团队", target=instance) del instance._created_by # 清理临时属性 print("创建团队的活动已记录")
内容的提问来源于stack exchange,提问作者jisoooh0202
相关产品推荐
相关产品推荐

