喜欢按钮 Django3 - KeyError at /nutriscore/exemple-1/

我希望你很好。我是 Python 的初学者,我正在尝试在这样的博客文章中实现一个赞按钮。在管理部分,我可以看到谁在点击类似的内容。

但是我遇到两个问题:

  • 第一个:当我点击“赞”按钮时,“返回”使用这种 url nutriscore/4/ 重定向我,或者我的文章使用了一个 slug(比如 /nutriscore/exemple-1/。你有什么想法吗?

  • 第二个:当我想显示喜欢的数量时 {{ total_likes }} 我有这个问题:KeyError at /nutriscore/exemple-1/ 'pk'

Models.py:

class Post(models.Model):

    ...

    likes = models.ManyToManyField(User, related_name='nutriscore_posts')

    

    def total_likes(self):

        return self.likes.count()

Views.py:


class PostList(generic.ListView):

    queryset = Post.objects.filter(status=1).order_by('-created_on')

    template_name = 'index.html'


def LikeView(request, pk):

    post = get_object_or_404(Post, id=request.POST.get('post_id'))

    post.likes.add(request.user)

    return HttpResponseRedirect(reverse('post_detail', args=[str(pk)]))


class PostDetail(generic.DetailView):

    model = Post

    context_object_name = 'post'

    template_name = 'post_detail.html'

    

    def get_context_data(self, **kwargs):

        context = super(PostDetail, self).get_context_data(**kwargs)

        stuff = get_object_or_404(Post, id=self.kwargs['pk'])

        total_likes = stuff.total_likes

        context['total_likes'] = total_likes

        return context

urls.py


path('like/<int:pk>', LikeView, name="like_post"),

post_detail.html


    <form action="{% url 'like_post' post.pk %}" method="POST">{% csrf_token %}<button type="submit" name="post_id" value="{{ post.id }}" class="cherry-likes"><img src="static/img/like.png" width="30px" height="30px" class="" title=""></button></form>

多谢 :)


HUH函数
浏览 102回答 2
2回答

慕盖茨4494581

您pk应该是int。您还在您的网址中指定为 int,但在视图中没有指定。post = get_object_or_404(Post, id=pk )if request.method == "POST":&nbsp;&nbsp; &nbsp; &nbsp;post.likes.add(request.user)&nbsp; &nbsp; &nbsp;return redirect('post_detail', post.pk)要显示帖子的总赞数,您需要添加property这样的装饰器@propertydef total_likes(self):&nbsp; &nbsp; return self.likes.count()现在在详细信息模板{{post.total_likes}}中将显示结果。无需编写get_context_data方法来显示 total_likes。

至尊宝的传说

第一个问题:你将 pk 传递给重定向,它是一个整数(根据你的 urls.py)到 url:&nbsp;args=[str(pk)]。如果你想重定向到一个 url,/nutriscore/exemple-1你应该传递 slug 而不是 pk(我猜这是 id)并相应地调整你的 urls.py。第二个问题:你确定那个帖子有一个名为 pk 的属性/键吗?这不应该是id吗?喜欢:<form&nbsp;action="{%&nbsp;url&nbsp;'like_post'&nbsp;post.id&nbsp;%}"&nbsp;method="POST">{%&nbsp;csrf_token&nbsp;%}<button&nbsp;type="submit"&nbsp;name="post_id"&nbsp;value="{{&nbsp;post.id&nbsp;}}"&nbsp;class="cherry-likes"><img&nbsp;src="static/img/like.png"&nbsp;width="30px"&nbsp;height="30px"&nbsp;class=""&nbsp;title=""></button></form>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python