django 中的 Mixins。?

问题描述 投票:0回答:1

Django 内置的基于类的视图提供了很多功能,但其中一些功能您可能需要单独使用。例如,您可能想编写一个视图来呈现模板以进行 HTTP 响应,但您不能使用 TemplateView;也许您只需要在 POST 上渲染模板,而 GET 完全做其他事情。虽然您可以直接使用 TemplateResponse,但这可能会导致重复的代码。

出于这个原因,Django 还提供了许多 mixin 来提供更离散的功能。例如,模板渲染被封装在 TemplateResponseMixin 中。 Django 参考文档包含

class AuthorDetailView(DetailView):
    model = Author

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["form"] = AuthorInterestForm()
        return context


class AuthorInterestFormView(SingleObjectMixin, FormView):
    template_name = "books/author_detail.html"
    form_class = AuthorInterestForm
    model = Author

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponseForbidden()
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse("author-detail", kwargs={"pk": self.object.pk})

class AuthorView(View):
    def get(self, request, *args, **kwargs):
        view = AuthorDetailView.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = AuthorInterestFormView.as_view()
        return view(request, *args, **kwargs)

请有人用简单的例子解释我......

python django mixins
1个回答
0
投票

问题中提供的代码和段落来自here,以防对阅读问题的人有用。

一个简单的 mixin 示例

如果 mixin 向您的类添加方法和属性,则简单的 mixin 可能只添加一种方法:

# views.py
class AddHelloToContextMixin:
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["hello"] = "Hello World!"
        return context

注意

context = super().get_context_data(**kwargs)
行,它正在调用父类的方法,因此父类的方法将用字典填充
context
变量,并且我们添加键值对
"hello" : "Hello World!"
作为额外的除此之外。

我们将该方法命名为

get_context_data
的原因是因为我们想要覆盖ContextMixin的方法,该方法在许多通用视图中使用。例如,检查Classy Class-Based Views处的TemplateViewListViewFormView:在那里,如果您单击“层次结构图”,您可以看到
ContextMixin
在所有这些视图中都被继承。

如果我们将这个

AddHelloToContextMixin
TemplateView
一起使用,它看起来会像这样:

# views.py
from django.views.generic import TemplateView


class MyView(AddHelloToContextMixin, TemplateView):
    template_name = "my_template.html"

然后您可以在模板中访问值

"Hello World!"
,如下所示:

<!-- my_template.html -->
{{hello}}

问题中代码的解释

AuthorView
是唯一一个从 UrlConf 映射来接收请求的视图,它将根据请求的类型调用其他两个视图。如果是 HTTP POST 请求,
AuthorInterestFormView
将管理该请求(请阅读
post
中的
AuthorView
方法)。如果是 HTTP GET 请求,
AuthorDetailView
将管理该请求(请阅读
get
中的
AuthorView
方法)。

代码中唯一的 mixin 是 SingleObjectMixin。它用于检索

Author
实例以进行进一步操作。

© www.soinside.com 2019 - 2024. All rights reserved.