代码可以正常工作,但问题是在我喜欢发布而不是点赞按钮之后,更改整个具有帖子的for循环停止。也就是说,除了用户名之外,没有显示任何其他内容。服务器不会抛出任何特定错误,只是不会显示for循环。我觉得渲染部分存在问题,但我不确定它到底有什么问题
下面是我的文件
views.py
__init__
models.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)
urls.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')
和home.html
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')
答案 0 :(得分:1)
您可以直接使用重定向快捷方式而不是render,因为render不会显示所有帖子。您可以将所有帖子传递给类似视图,也可以直接通过重定向来调用列表视图。
SomeInterface
答案 1 :(得分:1)
当您单击“赞”按钮时,您的代码正在like_post
视图中呈现。在这种情况下,上下文没有称为博客的数据。在like_post的末尾,您应该重定向到BlogsListView而不是返回HttpResponse。
您可以使用Django快捷键功能redirect来执行此操作。
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')
此外,您需要想出一些方法来在家中获得is_liked上下文。考虑查看文档here