Django Like Syste-> RedirectView不重定向到发布

问题描述

在尝试弄清楚如何为Django博客实现喜欢的系统时遇到了一个问题。我有一个帖子详细信息视图和一个PostRedirectView。我希望重定向视图获取我查看的帖子的绝对URL,并切换一个“喜欢” /“不同”,因为我的喜好系统是在我的posts.py中链接的ManyToManyField。以下是相关代码

views.py

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'post'

    def get_context_data(self,**kwargs):
        data = super().get_context_data(**kwargs)
        comments_connected = Comment.objects.filter(post_connected=self.get_object()).order_by('-date_posted')
        data['comments'] = comments_connected
        data['form'] = NewCommentForm(instance=self.request.user)
        return data

    def post(self,request,*args,**kwargs):
        new_comment = Comment(content=request.POST.get('content'),author=self.request.user,post_connected=self.get_object())
        new_comment.save()

        return self.get(self,**kwargs)


class PostLikeRedirect(RedirectView):
    def get_redirect_url(self,**kwargs):
        obj = get_object_or_404(Post,pk=self.kwargs.get('id'))
        return obj.get_absolute_url()

urls.py

  path('post/<int:pk>/',PostDetailView.as_view(),name='post-detail'),path('post/<int:pk>/like',PostLikeRedirect.as_view(),name='post-like'),

models.py

class Post(models.Model):
    content = models.TextField(max_length=1000)
    date_posted = models.DateTimeField(default=timezone.Now)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name="users_who_authored")
    like = models.ManyToManyField(settings.AUTH_USER_MODEL,blank=True,related_name="users_who_liked")

    def __str__(self):
        return f'{self.author} posts: {self.content[:8]}'

    @property
    def number_of_comments(self):
        return Comment.objects.filter(post_connected=self).count()


    def __str__(self):
        return f'{self.author} posted'

我收到的错误是在我发帖/ id(例如2)/ like和错误消息时找不到404

No Post matches the given query.

我知道错误的意思是我无法准确指出确切的时间以及未正确传递查询的位置

解决方法

您正试图从URL中获取 sponsor_id ,但是它被定义为 sponsor_id,total_points_a,total_points_b 。因此,将您的视图更改为

id