Python 当帖子被喜欢时,博客就会消失

Python 当帖子被喜欢时,博客就会消失,python,django,Python,Django,代码运行时没有任何问题,但问题是,在我喜欢一个post而不是like按钮之后,更改整个for循环,使post停止运行。ie除了用户用户名外,没有显示任何内容。服务器没有抛出任何特定错误,只是没有显示for循环。我觉得这是渲染部分的问题,但我不太确定它到底出了什么问题 下面是我的档案 views.py from django.shortcuts import render,get_object_or_404 from django.views.generic import ListView f

代码运行时没有任何问题,但问题是,在我喜欢一个post而不是like按钮之后,更改整个for循环,使post停止运行。ie除了用户用户名外,没有显示任何内容。服务器没有抛出任何特定错误,只是没有显示for循环。我觉得这是渲染部分的问题,但我不太确定它到底出了什么问题


下面是我的档案


views.py

from django.shortcuts import render,get_object_or_404
from django.views.generic import ListView
from .models import Blog
from django.http import HttpResponseRedirect

class BlogsList(ListView):
    model=Blog
    template_name='blog/home.html'
    context_object_name='blogs'
    ordering=['-date_posted']



def like_post(request, blog_id):
    post = get_object_or_404(Blog, id=blog_id)
    is_liked=False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        is_liked=False
    else:
        post.likes.add(request.user)
        is_liked=True
    context={
    'is_liked':is_liked
    }   
    return render(request, 'blog/home.html', context)

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse 

class Blog(models.Model):
    title=models.CharField(max_length=100)
    content=models.TextField()
    date_posted=models.DateTimeField(default=timezone.now)
    author=models.ForeignKey(User, on_delete=models.CASCADE)
    likes=models.ManyToManyField(User,related_name='likes',blank=True)
    def __str__(self):
        return self.title

    def get_absolute_url():
        return reverse('blog-home')

url.py

from django.urls import path
from . import views 

urlpatterns=[
path('',views.BlogsList.as_view(),name='blog-home'),
path('<int:blog_id>/like/', views.like_post, name='like_post')
从django.url导入路径
从…起导入视图
URL模式=[
路径(“”,views.BlogsList.as_view(),name='blog-home'),
路径('/like/',views.like_post,name='like_post')
] 和home.html

{{ user.username }}
{% block content %}
    {% for post in blogs %}
        <article class="media content-section">
          <img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
          <div class="media-body">
            <div class="article-metadata">
              <h2>{{ post.author }}</h2>
              <small class="text-muted">{{ post.date_posted|date:"F d, Y" }}</small>
            </div>
            <h2>{{ post.title }}</h2>
            <p class="article-content">{{ post.content }}</p>
          </div>
          <div>
            <form action="{% url 'like_post' post.id %}">
              {% csrf_token %}
              {% if is_liked %}
              <button type='submit' name='blog_id' value="{{ post.id }}" class="btn btn-danger">Unlike</button>
              {% else %}
              <button type='submit' name='blog_id' value="{{ post.id }}" class="btn btn-primary">Like</button>
              {% endif %}
            </form>
          </div>
        </article>
{% endfor %}
{% endblock %}
{{user.username}
{%block content%}
{%用于博客中的帖子%}
{{post.author}}
{{发布日期{发布日期:“F d,Y”}
{{post.title}}

{{post.content}

{%csrf_令牌%} {%if_%} 不像 {%else%} 喜欢 {%endif%} {%endfor%} {%endblock%}
您可以直接使用重定向快捷方式而不是渲染,因为渲染不会显示所有帖子。您可以在like视图中传递所有帖子,也可以通过重定向来调用列表视图

from django.shortcuts import redirect

def like_post(request, blog_id):
    # rest of code
    return redirect(post.get_absolute_url()) # redirect will going to call the BlogsList and your all post will be rendered

您可以直接使用重定向快捷方式而不是渲染,因为渲染不会显示所有的帖子。您可以在like视图中传递所有帖子,也可以通过重定向来调用列表视图

from django.shortcuts import redirect

def like_post(request, blog_id):
    # rest of code
    return redirect(post.get_absolute_url()) # redirect will going to call the BlogsList and your all post will be rendered

当您单击“相似”按钮时,您的代码将从
like\u post
视图进行渲染。在该视图中,上下文没有称为blog的数据。在like_帖子的末尾,您应该重定向到BlogsListView,而不是返回HttpResponse

您可以使用django快捷方式函数来执行此操作

from django.shortcuts import redirect
#...
#...
#... your code
def like_post(request, blog_id):
    post = get_object_or_404(Blog, id=blog_id)
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
    else:
        post.likes.add(request.user)
    return redirect('blog-home')

此外,你还需要找出一些方法来获得家中自己喜欢的环境。考虑检查文档

当你点击类似按钮时,你的代码是从<代码>在该视图中,上下文没有称为blog的数据。在like_帖子的末尾,您应该重定向到BlogsListView,而不是返回HttpResponse

您可以使用django快捷方式函数来执行此操作

from django.shortcuts import redirect
#...
#...
#... your code
def like_post(request, blog_id):
    post = get_object_or_404(Blog, id=blog_id)
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
    else:
        post.likes.add(request.user)
    return redirect('blog-home')

此外,你还需要找出一些方法来获得家中自己喜欢的环境。考虑检查文档

您的类视图中的呈现不具有渲染视图所需的后QuestSub设置;我建议在成功完成like后重定向到主页,即从django.shortcuts导入重定向并将
渲染
替换为
返回重定向(“博客主页”)
您在like视图中的渲染没有渲染视图所需的post查询;我建议在成功后直接重定向到主页,例如,从django.shortcuts导入重定向,并将
渲染
替换为
返回重定向(“博客主页”)
我最初是这样做的,但它不允许我通过is_like as context这实际上是一个非常混乱的情况,因为你是直接访问它的,你可以通过request.user查看,这只适用于一篇文章,而不是所有文章,也许你可以使用一个url作为文章详细信息页面,然后在该页面中,你可以轻松地执行此操作。@4545如果你想实现类似文章详细信息页面的功能,请告诉我我有类似的功能,如果你认为这个答案对你有帮助,那么试着把它作为你的答案,谢谢。你能告诉我你所说的帖子细节视图是什么意思吗?我的意思是,它会在主页上为帖子显示like按钮吗?帖子详细视图将与主页视图分开。你可以在模板中放置一个锚定标签以转到特定的帖子,这将缩短你主页的大小,并将帮助你在细节视图中做一些高级工作,因为你将只有一篇帖子。你对这个实现有什么看法,让我知道。我最初是这样做的,但它不允许我通过is_like as contextit实际上是一个非常混乱的情况,因为你直接通过request.user访问它,你可以通过request.user查看,这只适用于单个帖子,而不是所有帖子,也许你可以使用一个url作为发布详细信息页面,然后在该页面中,你可以轻松地执行此操作。@4545如果你想获得类似于发布详细信息页面的内容,请告诉我我有类似的内容,如果你认为此答案有助于你,请尝试将其作为你的答案,谢谢你能告诉我你所说的后期细节视图是什么意思吗?我的意思是,它会在主页上为帖子显示like按钮吗?帖子详细视图将与主页视图分开。你可以在模板中放置一个锚定标签以转到特定的帖子,这将缩短你主页的大小,并将帮助你在细节视图中做一些高级工作,因为你将只有一篇帖子。这是我无法将上下文传递到模板的实际问题这是我无法将上下文传递到模板的实际问题