【问题标题】:Django: how to inject data when overriding get_queryset()?Django:覆盖get_queryset()时如何注入数据?
【发布时间】:2015-07-23 10:56:37
【问题描述】:

基于 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() 方法。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    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 中有关该主题的更多信息。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 2023-03-29
        • 2020-10-07
        • 2020-05-03
        • 1970-01-01
        • 2020-05-29
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多