就像Django中的功能一样

时间:2017-03-07 08:26:43

标签: python django models

我正在开发一个社交平台,目前正在为用户帖子编写类似的功能。但是,我似乎无法使其发挥作用。这些是我的Models.py:

class Post(models.Model):
    user = models.ForeignKey(User)
    posted = models.DateTimeField(auto_now_add=True)
    content = models.CharField(max_length=150)
    picturefile = models.ImageField(upload_to="post_content", blank=True)

class Like(models.Model):
    user = models.ForeignKey(User, null=True)
    post = models.ForeignKey(Post, null=True)

我将帖子ID通过我的网址传递为'post_id',然后在我的视图中传递:

def liking(request, post_id):
    newlike = Like.objects.create()
    newlike.post = post_id
    newlike.user = request.user
    newlike.save()
    return redirect(reverse('dashboard'))

但是,它会返回以下错误:

Cannot assign "'47'": "Like.post" must be a "Post" instance.

有谁知道我错过了什么或做错了什么?

2 个答案:

答案 0 :(得分:2)

您正在传递newlike.post一个数字(整数字段),而期望Post个实例。

这可以工作:

from django.http.shortcuts import get_object_or_404

def liking(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    newlike = Like.objects.create(user=request.user, post=post)
    return redirect(reverse('dashboard'))

注意1:更好地使用方便的快捷方式get_object_or_404,以便在特定帖子不存在时引发404错误。 注2:通过调用objects.create将自动保存到数据库并返回实例!

答案 1 :(得分:1)

newlike.post应该是Post对象,而不是int。

您需要先找到id的帖子:

post = Post.objects.get(pk=post_id)
newlike.post = post

或者,如果您不想执行此查找:

newlike.post_id = post_id