python - 向 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>
解决方案
redirect('blog:post-detail', slug=post_obj.slug)
推荐阅读
- python - 使用 python 对象创建一个 MatPlotLib
- data-structures - 在堆排序中插入/删除相同的元素
- php - 我的代码没有正确添加整数,我做错了什么
- android - 当源为空时如何在 exoplayer 中显示离线消息
- wso2 - 芭蕾舞女演员 CLASS_NOT_FOUND 异常
- javascript - 表行折叠?
- java - 如何在没有数组的情况下找到您输入的数字的最小值和最大值?(简单的)
- python - 删除由 VSCode 在 Jupyter 中创建的“Python Interactive”环境?
- c++ - MT 程序如何用“非顺序”语义证明是正确的?
- flutter - Flutter安装后创建文件夹