Django 模板响应混合
Django TemplateResponseMixin
我是 Django 的新手,正在尝试使用基于 class 的视图进行混合。根据我的理解,mixin 是 classes 包含来自其他 classes 的方法的组合(类似于多重继承)。
我正在关注官方文档并搜索有关 SO 的问题,但不明白为什么 TemplateResponseMixin
本身就是一个 mixin。不同 classes 的哪些方法被注入 TemplateResponseMixin
?
您不会将某些东西 注入 混入。 mixin 的用途恰恰相反——你应该将 properties/methods 注入你的 class from mixin.
因此,当您的视图 class 混合在 TemplateResponseMixin
中时,您将在视图中得到 template_name
、render_to_response()
等。
TemplateResponseMixin - 可用于呈现模板的 mixin。
它有两种方法 -
render_to_response() 和 get_template_names()
有关详细信息,请参阅 here
您可以将 mixins
视为 部分 class,它们用于通过提供额外功能来丰富另一个 class。然而,mixins 本身不包含足够的信息来构成一个完整的 class,但它们为 class 添加了新功能。
在你的情况下,TemplateResponseMixin
不能单独被视为 View
class 因为它缺少许多关键方法,如 get
、post
或 dispatch
让我们将其识别为实际视图。
但是,在 BaseView
(或 View
)class 的帮助下,它创建了另一种名为 TemplateView
的视图形式,并赋予其渲染能力template
通过 render_to_response
方法不同于普通视图。
一个很好的比喻就是人体。它由不同的层组成,所有层都专门做某事,但是,底线
是,他们都首先需要某种骨骼系统才能保持在一起并保持有意义。因此,在这种情况下,人体骨骼(View
)将被视为使整个系统有意义的"thing",我们将包装skeleton up with a skin (TemplateResponseMixin
) in order to make it look like more human .
使用 Django 基于 class 的视图方法重新解释这个概念,我们得到;
class View(BaseView):
def dispatch(self, request, *args, **kwargs):
if request.method == GET:
self.get(request, *args, **kwargs)
elif request.method == POST:
self.post(request, *args, **kwargs)
...
如您所见,视图不知道它是否定义了 get()
方法,但是它知道有人会在负责处理的其他层 (TemplateView.get
) 中定义该方法传入的请求。
from django.shortcuts import render
class TemplateResponseMixin(object):
template_name = None
def render_to_response(self, request, context, **response_kwargs):
return render(request, self.template_name, context)
TemplateResponseMixin
本身并没有给我们任何关于其真正目的的线索,而 render_to_response
本身也毫无意义。但是,与 view
一起,它将用于使用视图逻辑呈现模板页面(换句话说 骨架)。
class TemplateView(TemplateResponseMixin, View):
template_name = 'some_app/some_template.html'
def get(self, request, *args, **kwargs):
context = get_context_from_somewhere(request, *args, **kwargs)
return self.render_to_response(request, context)
有一个非常有教育意义的 SO
线程 here 关于 mixins。我建议您仔细阅读所有答案。
我是 Django 的新手,正在尝试使用基于 class 的视图进行混合。根据我的理解,mixin 是 classes 包含来自其他 classes 的方法的组合(类似于多重继承)。
我正在关注官方文档并搜索有关 SO 的问题,但不明白为什么 TemplateResponseMixin
本身就是一个 mixin。不同 classes 的哪些方法被注入 TemplateResponseMixin
?
您不会将某些东西 注入 混入。 mixin 的用途恰恰相反——你应该将 properties/methods 注入你的 class from mixin.
因此,当您的视图 class 混合在 TemplateResponseMixin
中时,您将在视图中得到 template_name
、render_to_response()
等。
TemplateResponseMixin - 可用于呈现模板的 mixin。
它有两种方法 -
render_to_response() 和 get_template_names()
有关详细信息,请参阅 here
您可以将 mixins
视为 部分 class,它们用于通过提供额外功能来丰富另一个 class。然而,mixins 本身不包含足够的信息来构成一个完整的 class,但它们为 class 添加了新功能。
在你的情况下,TemplateResponseMixin
不能单独被视为 View
class 因为它缺少许多关键方法,如 get
、post
或 dispatch
让我们将其识别为实际视图。
但是,在 BaseView
(或 View
)class 的帮助下,它创建了另一种名为 TemplateView
的视图形式,并赋予其渲染能力template
通过 render_to_response
方法不同于普通视图。
一个很好的比喻就是人体。它由不同的层组成,所有层都专门做某事,但是,底线
是,他们都首先需要某种骨骼系统才能保持在一起并保持有意义。因此,在这种情况下,人体骨骼(View
)将被视为使整个系统有意义的"thing",我们将包装skeleton up with a skin (TemplateResponseMixin
) in order to make it look like more human .
使用 Django 基于 class 的视图方法重新解释这个概念,我们得到;
class View(BaseView):
def dispatch(self, request, *args, **kwargs):
if request.method == GET:
self.get(request, *args, **kwargs)
elif request.method == POST:
self.post(request, *args, **kwargs)
...
如您所见,视图不知道它是否定义了 get()
方法,但是它知道有人会在负责处理的其他层 (TemplateView.get
) 中定义该方法传入的请求。
from django.shortcuts import render
class TemplateResponseMixin(object):
template_name = None
def render_to_response(self, request, context, **response_kwargs):
return render(request, self.template_name, context)
TemplateResponseMixin
本身并没有给我们任何关于其真正目的的线索,而 render_to_response
本身也毫无意义。但是,与 view
一起,它将用于使用视图逻辑呈现模板页面(换句话说 骨架)。
class TemplateView(TemplateResponseMixin, View):
template_name = 'some_app/some_template.html'
def get(self, request, *args, **kwargs):
context = get_context_from_somewhere(request, *args, **kwargs)
return self.render_to_response(request, context)
有一个非常有教育意义的 SO
线程 here 关于 mixins。我建议您仔细阅读所有答案。