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>
这让我相信关键字参数是从视图对象本身检索的。