Django 模板响应混合

Django TemplateResponseMixin

我是 Django 的新手,正在尝试使用基于 class 的视图进行混合。根据我的理解,mixin 是 classes 包含来自其他 classes 的方法的组合(类似于多重继承)。

我正在关注官方文档并搜索有关 SO 的问题,但不明白为什么 TemplateResponseMixin 本身就是一个 mixin。不同 classes 的哪些方法被注入 TemplateResponseMixin

您不会将某些东西 注入 混入。 mixin 的用途恰恰相反——你应该将 properties/methods 注入你的 class from mixin.

因此,当您的视图 class 混合在 TemplateResponseMixin 中时,您将在视图中得到 template_namerender_to_response() 等。

TemplateResponseMixin - 可用于呈现模板的 mixin。

它有两种方法 -

render_to_response() 和 get_template_names()

有关详细信息,请参阅 here

您可以将 mixins 视为 部分 class,它们用于通过提供额外功能来丰富另一个 class。然而,mixins 本身不包含足够的信息来构成一个完整的 class,但它们为 class 添加了新功能。

在你的情况下,TemplateResponseMixin 不能单独被视为 View class 因为它缺少许多关键方法,如 getpostdispatch 让我们将其识别为实际视图。

但是,在 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。我建议您仔细阅读所有答案。