Python 为什么';邮政';在PostListView中
我不知道为什么我在Python 为什么';邮政';在PostListView中,python,python-3.x,django,django-models,django-views,Python,Python 3.x,Django,Django Models,Django Views,我不知道为什么我在PostListView中def-get\u-context\u-data时收到一条关键错误消息(KeyError at/'post')。但是,当我在PostListDetailView中def获取上下文数据时,这是完全正确的 Views.py def home(request): post = get_object_or_404(Post, id=request.POST.get('post_id')) if post.likes.filter(id=requ
PostListView
中def-get\u-context\u-data
时收到一条关键错误消息(KeyError at/'post')。但是,当我在PostListDetailView
中def获取上下文数据时,这是完全正确的
Views.py
def home(request):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
if post.likes.filter(id=request.user.id).exists():
is_liked = True
context = {
'posts': Post.objects.all(),
'is_liked': is_liked,
'total_likes': post.total_likes(),
}
return render(request, 'blog/home.html', context)
def like_post(request): # post like
post = get_object_or_404(Post, id=request.POST.get('post_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
return HttpResponseRedirect('http://127.0.0.1:8000/')
class PostListView(ListView):
model = Post
template_name = 'blog/home.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
ordering = ['-date_posted']
paginate_by = 5
is_liked = False
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
post = context['post']
if post.likes.filter(id=self.request.user.id).exists():
context['is_liked'] = True
return context
class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
class PostDetailView(DetailView):
model = Post
is_liked = False
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
post = context['post']
if post.likes.filter(id=self.request.user.id).exists():
context['is_liked'] = True
return context
但当我将密钥更改为“object_list”时,出现了一个新的错误“AttributeError at”/
“QuerySet”对象没有属性“likes”
__class__
<class 'blog.views.PostListView'>
context
{'is_paginated': True,
'object_list': <QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>,
'page_obj': <Page 1 of 3>,
'paginator': <django.core.paginator.Paginator object at 0x102f6f640>,
'posts': <QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>,
'view': <blog.views.PostListView object at 0x102f6f940>}
kwargs
{}
post
<QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>
self
<blog.views.PostListView object at 0x102f6f940>
\uuuu类
上下文
{'is_paginated':正确,
“对象列表”:,
“页面对象”:,
“paginator”:,
“职位”:,
“视图”:
夸尔斯
{}
邮递
自己
看起来您的上下文数据没有键post
,因此这不起作用
post=context['post']
请记住,DetailView
的get_context_data
(在postdailview
中使用的一个)可能与ListView
的get_context_data
(在PostListView
中使用的一个)不完全相同
postdailview
和PostListView
中的这一行做的事情不一样-
context=super()。获取上下文数据(**kwargs)
因为super
为这两个类引用了不同的类。在postdailview
的情况下,它是DetailView
,在PostListView
的情况下,它是ListView
——因此上下文在两个函数中不相同
您应该使用调试检查这两个不同的get\u context\u data
中的context
变量,并找出实际需要的键
编辑:为了详细说明如何调试,如果您使用的是VSCode,请参阅关于如何开始的快速指南
如果你在Pycharm上,另一个快速指南
启动调试感知后,您将能够设置断点(通过单击行号旁边),并且代码将在该断点处暂停。然后,您只需使用左侧(VSCode上)或底部(Pycharm上)的面板即可查看每个变量值。请发布完整信息traceback@Chase添加,Thankshagingpost=context['post']
到post=context['object\u list']
将不会给您想要的。现在在post
上执行.likes
是无效的,因为上下文['object\u list']
没有该属性。我确实看到里面有一个名为'posts'
的键,也许这就是你需要的?我建议您熟悉python dicts的基本知识。@LouisGlenn我为此添加了一个快速启动谢谢@Chase,但我已经检查了dubug并更改了object_列表的键,但是出现了一个新错误,AttributeError at/'QuerySet'对象没有属性'likes'
。我已在错误回溯下附上了本地_var详细信息。谢谢
__class__
<class 'blog.views.PostListView'>
context
{'is_paginated': True,
'object_list': <QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>,
'page_obj': <Page 1 of 3>,
'paginator': <django.core.paginator.Paginator object at 0x102f6f640>,
'posts': <QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>,
'view': <blog.views.PostListView object at 0x102f6f940>}
kwargs
{}
post
<QuerySet [<Post: aasd>, <Post: asd>, <Post: ads>, <Post: asd>, <Post: asd>]>
self
<blog.views.PostListView object at 0x102f6f940>