如何调用基于类的视图CBV中定义的函数/方法?

2024-03-28 17:07:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我学习Django框架已经3-4个月了,但是有一件事最让我困扰,我还没有找到一个满意的答案:当我们在基于类的视图中定义函数/方法时,它们会在创建某个对象时自动被调用吗?就像我们用的一样

@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()方法如何在基于类的视图中工作??他们如何处理模型中的数据

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

我可以在ClassBasedView中创建一个新方法吗?如果是,如何执行作为回报,在模板中呈现数据

请不要提供任何链接。我只想知道简单的英语术语。如果有人知道,那会很有帮助的


Tags: 数据对象方法self视图truedataget
1条回答
网友
1楼 · 发布于 2024-03-28 17:07:03

pathurl之前的2.X)函数中引用基于类的视图时,我们调用^{} class method。查看源代码可以发现,这实际上定义了一个函数视图,该视图调用基于类的视图的dispatch方法

这意味着基于类的视图中的入口点是dispatch方法。所有其他方法都是从dispatch开始调用的。dispatch立即调用的方法都是named according to HTTP methods(例如getpostdelete

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

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

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

一个常见的修改是向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/是编写基于类的视图的有用资源。当我写基于类的视图时,我总是引用那个站点

相关问题 更多 >