如何调用 class 基于视图 CBV 中定义的 function/methods?

How are the function/methods defined inside a class Based Views CBV are called?

我已经学习 Django 框架 3-4 个月了,但有 1 件事最让我烦恼,我无法找到满意的答案 yet.When 我们在里面定义了 functions/methods基于 Class 的视图,它们会在创建某些对象时自动调用吗?就像我们使用

@action(detail=False)
    def recent_users(self, request):
        recent_users = User.objects.all().order_by('-last_login')

        page = self.paginate_queryset(recent_users)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(recent_users, many=True)
        return Response(serializer.data)

这个方法将如何执行?我们必须创建一个对象并像 obj.method 那样调用吗?

那些 get() get_queryset() 方法如何与基于 Class 的视图一起工作?他们如何处理来自模型的数据?

最后一个问题是这两者的混合。

我可以在 ClassBasedView 中创建一个新方法吗?如果是,我如何执行它? 在 return 中说并在模板中呈现数据?

请不要提供任何 link。我只想用简单的英语来了解。如果有人知道,那将非常有帮助。

path(2.X 之前的 url)函数中引用基于 class 的视图时,我们调用 as_view class method。查看源代码将表明,这本质上定义了一个函数视图,该视图调用基于 class 的视图的 dispatch 方法。

这意味着基于 class 的视图的入口点是 dispatch 方法。所有其他方法都在 dispatch 之后的某处调用。 dispatch 立即调用的方法都是 named according to HTTP methods (E.G. get, post, delete).

这是从 TemplateView 继承的视图的典型路径。

  1. as_view returns 调用 dispatch.
  2. 的函数
  3. dispatch 调用 get 或者,如果 request.method 不是 GET,则调用 http_method_not_allowed 方法。
  4. get 调用 get_context_data 并将其作为参数传递给 render_to_response.
  5. render_to_response 调用 get_template_names 并将其作为参数传递给 TemplateResponse.

您可以在基于 class 的视图中定义您想要的任何方法,但除非您在已经被调用的地方调用它,否则不会调用它。

一个常见的修改是在 get_context_data.

中添加一些内容
   def get_context_data(self, **kwargs):
       kwargs.setdefault('recent_users', self.recent_users())
       return super().get_context_data(**kwargs)

   def recent_users(self):
       # self.request is accessible here.
       ...

https://ccbv.co.uk/ 是编写基于 class 的视图的有用资源。我在编写基于 class 的视图时一直引用该站点。