【问题标题】:How are the function/methods defined inside a class Based Views CBV are called?如何调用基于类的视图 CBV 中定义的函数/方法?
【发布时间】:2019-08-20 06:55:09
【问题描述】:

我已经学习 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 中创建一个新方法吗?如果是,我该如何执行? 作为回报并在模板中呈现数据?

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

【问题讨论】:

  • 您是否检查过view 是什么,为什么/如何使用它以及如何调用/执行它?
  • 我说的是基于类的视图。 get() 方法是怎么调用的? ti 会被自己调用吗>

标签: python oop django-rest-framework django-views django-class-based-views


【解决方案1】:

当在path(2.X 之前的url)函数中引用基于类的视图时,我们调用as_view 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/ 是编写基于类的视图的有用资源。我在编写基于类的视图时一直引用该站点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2020-02-17
    • 2014-06-23
    • 2022-11-20
    • 1970-01-01
    • 2018-08-21
    • 2017-12-31
    • 2013-01-25
    相关资源
    最近更新 更多