Python 指向此页面的类似Django的按钮不是’;行不通

Python 指向此页面的类似Django的按钮不是’;行不通,python,django,Python,Django,我尝试了另一种方法来为帖子创建一个类似的按钮,我已经达到了一个阶段,在这个阶段,按钮会指示我出现一个错误,即此页面不工作 不知道问题出在哪里。我正在学习一个教程,但唯一的区别是,教程在视图中为文章创建了一个带有上下文的函数,而我为文章创建了一个类。我不知道这是否是一些偏差和出现错误的原因 模型如下: class Post(models.Model): designer = models.ForeignKey(User, on_delete=models.CASCADE) titl

我尝试了另一种方法来为帖子创建一个类似的按钮,我已经达到了一个阶段,在这个阶段,按钮会指示我出现一个错误,即
此页面不工作

不知道问题出在哪里。我正在学习一个教程,但唯一的区别是,教程在视图中为文章创建了一个带有上下文的函数,而我为文章创建了一个类。我不知道这是否是一些偏差和出现错误的原因

模型如下:

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 %}
这是基地

{% 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>
{%load static%}
{%block extra_head%}
{%endblock%}
{%block content%}
{%endblock%}
{%include“footer.html”%}
{%include“scripts.html”%}
{%block extra_scripts%}
{%endblock额外_脚本%}

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

由于Django中的任何视图都必须返回一个
HTTPRESPONSE
,因此您只需返回这个

return HttpResponse("OK")

您可以使用HttpResponseRedirect而不是重定向,并且不要忘记从django导入它。http

您是否在
urls.py
中导入您的
视图?它通常以
视图的形式编写。如_post
。你能不能也更新你的
base.html
@AzyCrw4282是的,我在url中从.views导入了它(PostCreateView,PostDeleteView,PostDetailView,PostListView,PostUpdateView,UserPostListView,类似于_post)
用什么更新base?将base.html的代码添加到帖子中。@AzyCrw4282完成了,但是base与问题有什么关系?@PruthviBarot当我缩进它并添加到类作用域时,它会断开服务器的连接
importorror:无法从“score.views”导入名称“like_post”
我添加了return HttpResponse(“确定”)它也很成功,我用
return redirect('score:like_post')
替换了它,但是按钮没有从“喜欢”变为“不喜欢”,我不认为发生了任何操作按钮的更改应该由Javascript处理。因此,您需要检查在处理响应时发生了什么。在我在adminWell中检查时,没有记录喜欢的内容。如果您的view函数执行了,那么它应该被更新。鉴于此,
教程在视图中为文章创建了一个带有上下文的函数,而我为文章创建了一个类。
这也可能是由于差异造成的。
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())