django中的Mixins

up9lanfz  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(85)

Django内置的基于类的视图提供了很多功能,但其中一些你可能想单独使用。例如,您可能希望编写一个视图来呈现一个模板以生成HTTP响应,但不能使用TemplateView;也许你只需要在POST上呈现一个模板,而GET完全是在做其他的事情。虽然您可以直接使用TemplateResponse,但这可能会导致重复代码。
出于这个原因,Django还提供了许多mixin,这些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)

字符串
请有人解释我,用简单的例子.

mw3dktmi

mw3dktmi1#

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

一个简单的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:在那里,如果你点击“Hierarchy Diagram”,你可以看到ContextMixin在所有这些中被继承。
如果我们将这个AddHelloToContextMixinTemplateView一起使用,它看起来像这样:

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

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


然后你可以像这样在你的模板中访问"Hello World!"值:

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

问题中代码说明

AuthorView是唯一一个从UrlConfsMap来接收请求的视图,它将根据请求的类型调用其他两个视图。如果是HTTP POST请求,AuthorInterestFormView将管理该请求(读取AuthorView中的post方法)。如果是HTTP GET请求,AuthorDetailView将管理该请求(读取AuthorView中的get方法)。
代码中唯一的mixin是SingleObjectMixin。它用于检索Author示例以进行进一步的操作。

相关问题