首页 > 解决方案 > 无法从 ListView 的 get_queryset 获取 kwargs

问题描述

我想在'views.py'中获取每个帖子的pk或id,以便我可以使用它来过滤和获取'get_context_data'中的额外数据(最终,我想检查当前登录用户对每个帖子的访问) . 当网站运行时,它显示错误消息“KeyError at /post”。

这可能是什么问题?

我试图在 django 的官方网站(https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/)中应用示例。
我看不出这个例子和我的有显着差异。

视图.py

class PostList(ListView):
    model = Post
    template_name = 'post/post_list.html'

    def get_queryset(self):
        self.post = get_object_or_404(Post, pk=self.kwargs['pk'])
        return Post.objects.filter(pk=self.post)

    def get_context_data(self, **kwargs):
         context = super(PostList, self).get_context_data(**kwargs)
         context['post_info'] = self.post
         context['check_access'] = Access.objects.filter(sender
         return context

发布/urls.py

urlpatterns = [
   path('<int:pk>', PostList.as_view(), name='post_list'),
]

我希望看到每个帖子的 pk 或 id ,但它显示在下面:

self.post = get_object_or_404(Post, pk=self.kwargs['pk']) ...
▼ Local vars
Variable    Value
args    
()
kwargs  
{}
self    
<post.views.PostList object at 0x107ab0ba8>

标签: djangolistviewdjango-queryset

解决方案


那么 URL 缺少主键。你必须包括它,比如:

urlpatterns = [
    path('<int:pk>', PostList.as_view(), name='post_list'),
]

然后您可以使用以下方式查询:

localhost:8000/post/123

使用123您要为其检索数据的主键。

然而,这看起来不像[ ListViewDjango-doc]。渲染对象列表ListView时应使用A。这看起来更像[Django-doc]DetailView

a 的好处DetailView是它甚至可以自动过滤主键和 slug。如果不存在这样的对象,它将自动引发 404 响应。

所以你可能想使用:

class PostDetailView(DetailView):
    model = Post
    context_object_name = 'post'
    template_name = 'post/post_list.html'

    def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context['check_access'] = Access.objects.filter(...)
         return context

context_object_name[Django-doc]指定该对象的模板变量的名称。


推荐阅读