我尝试了另一种方法来为帖子创建一个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
,而views.like_post
会再次重定向到自身。因此,会导致无限重定向问题。您可以通过重定向到其他视图或使用教程中所示的初始实现来修复此问题由于Django中的任何视图都必须返回一个
HTTPRESPONSE
,所以您可以只返回这个值您可以使用HttpResponseRedirect代替重定向,并且不要忘记从django.http导入它
相关问题 更多 >
编程相关推荐