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)
请有人用简单的例子解释我......
问题中提供的代码和段落来自here,以防对阅读问题的人有用。
如果 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处的TemplateView、ListView和FormView:在那里,如果您单击“层次结构图”,您可以看到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
实例以进行进一步操作。