首页 > 解决方案 > 向 Django 博客项目添加“赞”按钮无法正常工作

问题描述

在我的博客 Django 项目中,我正在尝试创建一个 Like 功能,但目前面临以下错误:

Reverse for 'post-detail' with no arguments not found. 1 pattern(s) tried: ['blog/(?P<slug>[-a-zA-Z0-9_]+)/$']

我应该怎么做才能防止此错误并在按下“赞”按钮后返回相同的帖子详细信息页面?

这是 urls.py

    path('blog/<slug:slug>/', PostDetailView.as_view(), name='post-detail'),
    path('blogs/like', like_post, name='like-post'),

这是models.py

class Post(models.Model):
    liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')
   
    def num_likes(self):
        return self.liked.all().count()
    
def get_absolute_url(self):
        return reverse('blog:post-detail', kwargs={'slug': self.slug})

LIKE_CHOICES = (
    ('Like', 'Like'),
    ('Unlike', 'Unlike')
)

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    value = models.CharField(choices=LIKE_CHOICES, default='Like', max_length=10)
    date_liked = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return str(self.post)

以下是观点:我进行了几次试验但没有奏效,我在views.py的末尾评论了它们,因为它们返回了like_post() missing 1 required positional argument: 'slug'

class PostListView(ListView):
    model = Post
    template_name = "blog/post_list.html"  # <app>/<model>_<viewtype>.html
    ordering = ['-date_posted']
    context_object_name = 'posts'
    paginate_by = 1

class PostDetailView(DetailView):
    model = Post
    template_name = "blog/post_detail.html"  # <app>/<model>_<viewtype>.html

    def get(self, request, *args, **kwargs):
        res = super().get(request, *args, **kwargs)
        self.object.incrementViewCount()
        return res

def like_post(request):
    user=request.user
    if request.method=='POST':
        post_id=request.POST.get('post_id')
        post_obj= Post.objects.get(id=post_id)

        if user in post_obj.liked.all():
            post_obj.liked.remove(user)
        else:
            post_obj.liked.add(user)

        like,created=Like.objects.get_or_create(user=user,post_id=post_id)

        if not created:
            if like.value=='Like':
                like.value='Unlike'
            else:
                like.value='Like'
        like.save()

    return redirect('blog:post-detail') <------------ Error Showing from Here

    #post = get_object_or_404(Post, slug=Post.slug)
    #if post.slug != slug:
        #return redirect('blog:post-detail', slug=Post.slug)

这是模板:

      <form action="{% url 'blog:like-post' %}" method="POST">
        {% csrf_token %}
        <input type="hidden" name="post_id" value='{{post.id}}'>
        {% if user not in obj.liked.all %}
          <button class="ui button positive" type="submit"> Like</button>
        {% else %}
          <button class="ui button negative" type="submit">Unlike</button>
        {% endif %}
        <br>
        <strong>{{ post.liked.all.count }} Likes</strong>
      </form>

标签: pythondjango

解决方案


redirect('blog:post-detail', slug=post_obj.slug)

推荐阅读