【问题标题】:Django CBVs: get_queryset() and get_context_data()?Django CBV:get_queryset() 和 get_context_data()?
【发布时间】:2020-08-02 00:00:59
【问题描述】:

ListView 中的get_queryset() 和get_context_data() 有什么区别(以及它们的关系是什么)。

什么在get_context_data(self, **kwargs) 中作为**kwargs 传递,例如在path(' ', SomeViewList.as_view()) 中?

我的问题既适用于默认方法,也适用于被覆盖的方法。

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    get_queryset

    此方法确定要显示的对象列表。默认情况下,它将为您提供您在视图中指定的所有模型,但您可以覆盖它并应用过滤器、排序等。Documentation。

    class FilteredAuthorView(ListView):
        template_name = 'authors.html'
        model = Author
    
        def get_queryset(self):
            # original qs
            qs = super().get_queryset() 
            # filter by a variable captured from url, for example
            return qs.filter(name__startswith=self.kwargs['name'])
    

    get_context_data

    此方法用于将字典填充为模板上下文。例如,ListViews 将从get_queryset() 填充结果(不调用实际函数),但您也可以灵活地将额外数据渲染到上下文中。

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        data['page_title'] = 'Authors'
        return data
    

    这是两个独立的方法,因此它们之间没有直接关系。我认为get_context_data 比get_queryset 更复杂,因为您可以将自定义内容附加到您的上下文中。

    关于关键字参数(kwargs),Django 需要它在添加您的自定义内容之前调用基本实现(即获取默认模型),即使您不需要。 kwargs 将包含您的视图附带的模型、模板名称等。 Documentation

    Reference

    编辑

    我这里有一个视图,我尝试打印出上下文数据:

    class JSONProfileView(JSONResponseMixin, DetailView):
        model = User
        template_name = 'accounts/dashboard/profile-json.html'
    
        def get_context_data(self, **kwargs):
            print(', '.join(['{}={!r}'.format(k, v) for k, v in kwargs.items()]))
            data = serializers.serialize('json', self.get_queryset())
            return data
    

    我知道了:

    object=<User: userslug>
    

    这让我相信关键字参数是从视图对象本身检索的。

    【讨论】:

    • get_context_data(self, **kwargs) 从哪里获取 **kwargs 参数?
    • 编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多