Django:重写get_queryset()时如何注入数据?

时间:2015-07-23 10:56:37

标签: python django django-class-based-views

基于Django类的视图非常简单。 我有一个运行良好的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()方法中。

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  • 网址表达式中的捕获参数
  • 网址定义中指定的其他参数

所有这些都在urls.py。

因此,举例来说,为了从表单中获取ID,请使用以下格式:/folder/id/

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

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

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

Django documentation中有关此主题的更多信息。