如何在Django中使用Post_save
我正在尝试在用户提交评论后,给他们的个人资料添加积分,使用的是Django的评论框架。我觉得我需要用到post_save,但说实话我不太确定。
这是我在models.py文件中写的方法:
def add_points(request, Comment):
if Comment.post_save():
request.user.get_profile().points += 2
request.user.get_profile().save()
根据我找到的post_save的例子,我觉得我写的和示例差得很远,所以我觉得我可能走错了方向。
谢谢你的帮助。
1 个回答
2
很遗憾,这段话完全没有道理。
首先,这不能算是一个方法,因为它的第一个参数没有写 self
。
其次,它似乎是在处理类,而不是类的实例。你不能保存类本身,只能保存它的实例。
第三,post_save
不是模型的方法(除非你自己定义了一个)。它是一个信号,你不能直接调用信号,而是要给信号添加一个处理器,然后在处理器里写逻辑。你也不能从信号中返回数据给方法。
最后,你在第二行中保存的实例和你加了2的那个实例不一定是同一个,因为Django模型实例没有身份识别。你应该先获取一次实例并把它放到一个变量里,然后再保存。
评论框架定义了自己的信号,你可以用它来替代通用的 post_save。所以,你实际上需要做的是在 comment_was_posted 上注册一个信号处理器。在这个处理器里,你需要获取用户的个人资料,并进行更新。
def comment_handler(sender, comment, request, **kwargs):
profile = request.user.get_profile()
profile.points += 2
profile.save()
from django.contrib.comments.signals import comment_was_posted
comment_was_posted.connect(comment_handler, sender=Comment)