Django:如何在覆盖 get_queryset() 时注入数据?

Django: how to inject data when overriding get_queryset()?

非常熟悉基于 Django class 的视图。 我有一个运行良好但显示所有对象的 ListView。我想过滤这个,这里是我所做的,下面是一些发现的例子:

models.py:

class FolderElement(TimeStampedModel):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

class FolderMedia(TimeStampedModel):
    folder_element = models.ForeignKey(FolderElement)
    file = models.FileField(upload_to=generate_filepath_folder)
    slug = models.SlugField(max_length=50, blank=True)

views.py:

class FolderMediaListView(ListView):
    model = FolderMedia
    template_name = "book.html"

    def get_queryset(self):
        self.folder_element = get_object_or_404(FolderElement,
                                                pk=self.kwargs['pk'])
        return FolderMedia.filter(folder_element=self.folder_element)

    def render_to_response(self, context, **response_kwargs):
        files = [ serialize(p) for p in self.get_queryset() ]
        data = {'files': files}
        response = JSONResponse(data, mimetype=response_mimetype(self.request))
        response['Content-Disposition'] = 'inline; filename=files.json'
        return response

但现在我覆盖了 get_queryset() 方法,我不明白我应该如何将 pk 参数注入视图以便过滤器工作。目前,使用 pdb,我可以看到 self.kwargs 等于 {} 进入 get_queryset() 方法。

谢谢。

您需要在 URL 中提供它。例如:

url(r'folder/(?P<id>\d+)/media', FolderMediaListView.as_view, name='folder_media_list')

Django URL 调度程序传递给视图的关键字参数 (kwargs) 来自以下内容:

  • 在URL表达式中捕获的参数
  • URL 定义中指定的其他参数

全部在 urls.py.

因此,例如,为了从 URL 中获取 ID,格式如下:/folder/id/:

url(r'folder/(?P<pk>\d+)/', FolderMediaListView.as_view)

或者如果 id 是常量(很少见),您可以将其作为附加参数传递:

url(r'folder/', FolderMediaListView.as_view, {'pk': 1})

有关该主题的更多信息,请参见 Django documentation