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)
字符串
请有人解释我,用简单的例子.
1条答案
按热度按时间mw3dktmi1#
问题中提供的代码和段落来自这里,以防对阅读问题的人有用。
一个简单的mixin示例
如果一个mixin向你的类添加了方法和属性,那么一个简单的mixin可能只添加了一个方法:
字符串
注意
context = super().get_context_data(**kwargs)
行,它调用父类中的方法,因此父类中的方法将用字典填充context
变量,我们将键值对"hello" : "Hello World!"
作为额外的添加添加到该上下文中。我们之所以将该方法命名为
get_context_data
,是因为我们希望覆盖ContextMixin的方法,该方法在许多通用视图中使用。例如,在Classy Class-Based Views处检查TemplateView、ListView和FormView:在那里,如果你点击“Hierarchy Diagram”,你可以看到ContextMixin
在所有这些中被继承。如果我们将这个
AddHelloToContextMixin
与TemplateView
一起使用,它看起来像这样:型
然后你可以像这样在你的模板中访问
"Hello World!"
值:型
问题中代码说明
AuthorView
是唯一一个从UrlConfsMap来接收请求的视图,它将根据请求的类型调用其他两个视图。如果是HTTP POST请求,AuthorInterestFormView
将管理该请求(读取AuthorView
中的post
方法)。如果是HTTP GET请求,AuthorDetailView
将管理该请求(读取AuthorView
中的get
方法)。代码中唯一的mixin是SingleObjectMixin。它用于检索
Author
示例以进行进一步的操作。