python - 指向此页面的 Django Like 按钮不起作用
问题描述
我尝试了另一种方法来为帖子创建一个类似的按钮,我已经到了按钮将我引导到错误的阶段This page isn’t working
不确定问题出在哪里。我正在关注一个教程,但唯一的区别是,当我为帖子创建一个类时,教程为帖子创建了一个函数,并在视图中包含上下文。我不知道这是否是一些偏差和出现错误的原因
这是模型:
class Post(models.Model):
designer = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
---- Others unrelated models------
likes = models.ManyToManyField(User, blank=True, related_name='liked')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("score:post-detail", kwargs={'pk': self.pk})
@property
def num_likes(self):
return self.liked.all().count()
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)
def __str__(self):
return str(self.post)
这是意见
class PostDetailView(DetailView):
model = Post
template_name = "post_detail.html"
class PostListView(ListView):
model = Post
template_name = "score.html"
ordering = ['-date_posted']
context_object_name = 'posts'
queryset = Post.objects.filter(admin_approved=True)
paginate_by = 5
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('score:like_post')
这是完整的模板
{% extends "base.html"%}
{% block content %}
{% for post in posts %}
<div style="padding-top:200 px"><strong>{{post.title}}</strong></div>
<form action="{% url 'score:like_post'%}" method='POST' class="ui form">
{% csrf_token %}
<input type='hidden' name='post_id' value="{{post.id}}">
{% if user not in post.liked.all %}
<button class= "ui button positive" type='submit'> Like </button>
{% else %}
<button class= "ui button negative" type='submit'> Unlike </button>
{% endif %}
</form>
<strong>{{post.liked.all.count}} Likes </strong>
{% endfor %}
{% endblock content %}
这是网址
path('', PostListView.as_view(), name='score'),
path('like/', like_post, name='like_post'),
这是基地
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>
{% block extra_head %}
{% endblock %}
</head>
<body>
<!--Main layout-->
{% block content %}
{% endblock %}
<!--Main layout-->
<!--Footer-->
{% include "footer.html" %}
<!--/.Footer-->
<!-- SCRIPTS -->
{% include "scripts.html" %}
<!-- SCRIPTS -->
{% block extra_scripts %}
{% endblock extra_scripts %}
</body>
</html>
解决方案
这似乎是无限递归的结果,即当您单击like 按钮时,它会将您重定向到views.like_post
,它再次重定向到自身。因此,导致无限重定向问题。您可以通过重定向到其他视图或使用教程中显示的初始实现来解决此问题。
由于 Django 中的任何视图都必须返回一个HTTPRESPONSE
,你可以只返回这个
return HttpResponse("OK")
推荐阅读
- php - 如何通过在 Excel 表中使用 PHP 删除重复的 id 来计算列值的总和?
- security - 对最终用户隐藏水疗应用程序中的 .env 变量值
- wordpress - 文件上传后自动删除
- node.js - nodejs express post请求中的请求正文为空
- dart - 为什么 "".leftPad ( 0 ) 产生与 "".leftPad ( 1 ) 相同的结果?
- c# - 将包添加到 .NET Core 应用程序时,Visual Studio 2017 不会自动安装依赖项
- xml - 在 VB.net 中使用 XMLReader 读取大型 XML 文件
- tfs - TFS 报告服务器:显示工作项是否从区域路径退回到区域路径的报告
- php - 如何使用 node.js 向使用 https-post 的 php 页面进行 POST 请求?
- azure - Azure DevOps 需要哪些权限才能发布 NPM 包