无法从ListView的get_queryset获取kwargs

时间:2019-06-23 13:53:42

标签: django listview django-queryset

我想获取pk或“ views.py”中每个帖子的ID,以便可以将其用于过滤并获取“ get_context_data”中的额外数据(最终,我想检查当前登录用户对每个帖子)。网站运行时,显示错误消息“ / post处的KeyError”。

这可能是个问题吗?

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

views.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

post / 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>

1 个答案:

答案 0 :(得分:0)

该URL缺少主键。您必须包含它,例如:

8

然后,您可以使用以下方法进行查询:

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

使用localhost:8000/post/123 要为其检索数据的主键。

但是,不是看起来像ListView [Django-doc]。渲染对象的列表时,应使用123。看起来更像是DetailView [Django-doc]

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

所以您可能想使用:

DetailView

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