Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';邮政';在PostListView中_Python_Python 3.x_Django_Django Models_Django Views - Fatal编程技术网

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添加,Thankshaging
post=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>