如何调用 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
继承的视图的典型路径。
as_view
returns 调用 dispatch
. 的函数
dispatch
调用 get
或者,如果 request.method
不是 GET
,则调用 http_method_not_allowed
方法。
get
调用 get_context_data
并将其作为参数传递给 render_to_response
.
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 的视图时一直引用该站点。
我已经学习 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
继承的视图的典型路径。
as_view
returns 调用dispatch
. 的函数
dispatch
调用get
或者,如果request.method
不是GET
,则调用http_method_not_allowed
方法。get
调用get_context_data
并将其作为参数传递给render_to_response
.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 的视图时一直引用该站点。