【问题标题】:Django Like button directing to This page isn’t working指向此页面的 Django Like 按钮不起作用
【发布时间】:2020-05-12 03:40:26
【问题描述】:

我尝试了另一种方法来为帖子创建一个赞按钮,我已经到了按钮将我引导至错误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>

【问题讨论】:

  • 您是否将您的views 导入到urls.py 中?它通常写成views.like_post。你能更新你的base.html吗?
  • @AzyCrw4282 是的,我在 url from .views import (PostCreateView, PostDeleteView, PostDetailView, PostListView, PostUpdateView, UserPostListView, like_post) 中导入了它,用什么更新基础?
  • 将base.html的代码添加到帖子中
  • @AzyCrw4282 完成了,但这个问题与基础有什么关系?
  • @PruthviBarot 当我缩进它并添加到类范围时它会断开服务器ImportError: cannot import name 'like_post' from 'score.views'

标签: python django


【解决方案1】:

这似乎是无限递归的结果,即当您单击“赞”按钮时,它会将您重定向到views.like_post,而views.like_post 又会重定向到它自己。因此,导致无限重定向问题。您可以通过重定向到其他视图或使用教程中显示的初始实现来解决此问题。

由于 Django 中的任何视图都必须返回一个HTTPRESPONSE,所以你可以直接返回这个

return HttpResponse("OK")

【讨论】:

  • 我添加了 return HttpResponse("OK") 并且它成功了我也用return redirect('score:like_post') 替换了它,但是按钮并没有从喜欢变为不同我认为没有采取任何行动地点
  • 按钮更改应由 Javascript 处理。因此,您需要在处理响应时检查发生了什么。
  • 我在后台查看时没有记录喜欢
  • 好吧,如果你的视图函数执行了,那么它应该被更新。鉴于此tutorial created a function for the post with context in the views while I created a class for the post.,也可能由于差异而发生。
【解决方案2】:
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 导入它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多