Django Query Error: How do i properly query my total likes to show in the Home Screen?
Django Query Error: How do i properly query my total likes to show in the Home Screen?
任何人都可以建议如何查询要在我的 HTML 中显示的 post 的 `total_likes,我试过了,但出现了这个错误:
Page not found (404)
No BlogPost matches the given query.
谢谢!
我认为这可能是我查询和链接博客 post 的方式,但我不确定为什么我错了,尽管尝试了但我不知道如何修改它几个小时。
views.py
def home_feed_view(request, **kwargs):
context = {}
blog_posts = sorted(BlogPost.objects.all(), key= attrgetter('date_updated'), reverse = True)
blog_post = get_object_or_404(BlogPost, slug=request.POST.get('blog_post_slug'))
total_likes = blog_post.total_likes()
liked = False
if blog_post.likes.filter(id=request.user.id).exists():
liked = True
context['blog_posts'] = blog_posts
context['blog_post'] = blog_post
context['total_likes'] = total_likes
return render(request, "HomeFeed/snippets/home.html", context)
def LikeView(request, slug):
context = {}
post = get_object_or_404(BlogPost, slug=slug)
liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
else:
post.likes.add(request.user)
liked = True
return redirect('HomeFeed:detail', slug=slug)
.html
{% for post in blog_posts %}
<td class="table-primary">
<form action="{% url 'HomeFeed:like_post' post.slug %}" method="POST">
{% csrf_token %}
<button type="submit" name="blog_post_slug" value="{{post.slug}}" class='btn btn-primary btn-sm'>
Like
</button>
{{ total_likes }} Likes
</form>
</td>
{% endfor %}
models.py
class BlogPost(models.Model):
body = models.TextField(max_length=5000, null=False, blank=False)
likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
slug = models.SlugField(blank=True, unique=True)
def total_likes(self):
return self.likes.count()
urls.py
from django.urls import path
from HomeFeed.views import(
home_feed_view,
LikeView,
)
urlpatterns = [
path('', home_feed_view , name= "main"),
path('<slug>/like/', LikeView, name='like_post'),
]
异常:Page not found (404) No BlogPost matches the given query.
由 get_object_or_404
提出,因为它确实如其名。如果数据库中不存在任何视图中提供的 slug
的 BlogPost
,Django 将在您看到时引发 Http404
异常。
现在,由于我们不知道您的 BlogPost
模型的结构,我无法真正告诉您更改的位置,我只能告诉您的是您需要确保 slug
是每个 BlogPost
实例上的唯一字段,否则您的代码将按预期工作。
编辑
我没看过BlogPost
模型,不好意思,不过资料还是相关的,这样的slug
的BlogPost是不存在的。因此,请进行手动检查,查看 slug 以什么形式到达视图,然后在数据库或您的 shell.
中手动检查
任何人都可以建议如何查询要在我的 HTML 中显示的 post 的 `total_likes,我试过了,但出现了这个错误:
Page not found (404)
No BlogPost matches the given query.
谢谢!
我认为这可能是我查询和链接博客 post 的方式,但我不确定为什么我错了,尽管尝试了但我不知道如何修改它几个小时。
views.py
def home_feed_view(request, **kwargs):
context = {}
blog_posts = sorted(BlogPost.objects.all(), key= attrgetter('date_updated'), reverse = True)
blog_post = get_object_or_404(BlogPost, slug=request.POST.get('blog_post_slug'))
total_likes = blog_post.total_likes()
liked = False
if blog_post.likes.filter(id=request.user.id).exists():
liked = True
context['blog_posts'] = blog_posts
context['blog_post'] = blog_post
context['total_likes'] = total_likes
return render(request, "HomeFeed/snippets/home.html", context)
def LikeView(request, slug):
context = {}
post = get_object_or_404(BlogPost, slug=slug)
liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
else:
post.likes.add(request.user)
liked = True
return redirect('HomeFeed:detail', slug=slug)
.html
{% for post in blog_posts %}
<td class="table-primary">
<form action="{% url 'HomeFeed:like_post' post.slug %}" method="POST">
{% csrf_token %}
<button type="submit" name="blog_post_slug" value="{{post.slug}}" class='btn btn-primary btn-sm'>
Like
</button>
{{ total_likes }} Likes
</form>
</td>
{% endfor %}
models.py
class BlogPost(models.Model):
body = models.TextField(max_length=5000, null=False, blank=False)
likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
slug = models.SlugField(blank=True, unique=True)
def total_likes(self):
return self.likes.count()
urls.py
from django.urls import path
from HomeFeed.views import(
home_feed_view,
LikeView,
)
urlpatterns = [
path('', home_feed_view , name= "main"),
path('<slug>/like/', LikeView, name='like_post'),
]
异常:Page not found (404) No BlogPost matches the given query.
由 get_object_or_404
提出,因为它确实如其名。如果数据库中不存在任何视图中提供的 slug
的 BlogPost
,Django 将在您看到时引发 Http404
异常。
现在,由于我们不知道您的 BlogPost
模型的结构,我无法真正告诉您更改的位置,我只能告诉您的是您需要确保 slug
是每个 BlogPost
实例上的唯一字段,否则您的代码将按预期工作。
编辑
我没看过BlogPost
模型,不好意思,不过资料还是相关的,这样的slug
的BlogPost是不存在的。因此,请进行手动检查,查看 slug 以什么形式到达视图,然后在数据库或您的 shell.