指向此页面的Django-Like按钮不起作用

2024-09-17 19:52:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了另一种方法来为帖子创建一个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>

Tags: nameselfidreturnmodelsdefhtmlbutton
2条回答

这似乎是无限递归的结果,即当您单击like按钮时,它会将您重定向到views.like_post,而views.like_post会再次重定向到自身。因此,会导致无限重定向问题。您可以通过重定向到其他视图或使用教程中所示的初始实现来修复此问题

由于Django中的任何视图都必须返回一个HTTPRESPONSE,所以您可以只返回这个值

return HttpResponse("OK")
def like_post(request):
    user = request.user
    post = get_object_or_404(Post,id=request.POST.get('post_id'))
    if request.method == 'POST':
        post_id = request.POST.get('post_id')
        post_obj = Post.objects.get(id=post_id)

        if user in post_obj.likes.all():
            post_obj.likes.remove(user)
        else:
            post_obj.likes.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 HttpResponseRedirect(post.get_absolute_url())

您可以使用HttpResponseRedirect代替重定向,并且不要忘记从django.http导入它

相关问题 更多 >