self.kwargs的含义????
继承DetailView类和ListView类的区别????
1.都可以重写template_name属性,DetailView是给模板传一个object对象,ListView给模板传一个queryset对象(多个)
2.都可以重写model属性,都可以重写get_queryset方法,get_queryset方法默认是返回model.objects.all()
3.DetailView有get_object方法,默认是从get_queryset的结果中筛选出pk=xx的,pk来自url的get请求参数(self.kwargs);而ListView没有get_object方法
自定义的View每次访问都创建对象还是只创建一个对象????
每访问一次MyView的get方法就创建一个MyView对象
所以每次访问返回都是“2”
各个View的多重继承关系??
from django.views import View
from django.views.generic import TemplateView, ListView, DetailView, FormView....
另外还有:
'RedirectView', 'ArchiveIndexView',
'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
'TodayArchiveView', 'DateDetailView',
'CreateView', 'UpdateView', 'DeleteView',
DetailView:
TemplateView :
ListView:
FormView:
CreateView:
UpdateView:
DeleteView:
ArchiveIndexView:
YearArchiveView:处理URL中包括'../year/'的归档请求,需要重写get方法,在get方法中调用get_dated_items()方法,列表展示
MonthArchiveView:处理URL中包括'../year/month'的归档请求,需要重写get方法,在get方法中调用get_dated_items()方法,列表展示
WeekArchiveView:处理URL中包括'../year/week'的归档请求,需要重写get方法,在get方法中调用get_dated_items()方法,列表展示
DayArchiveView:处理URL中包括'../year/month/day'的归档请求,需要重写get方法,在get方法中调用get_dated_items()方法,列表展示
TodayArchiveView:获取当前时间datetime.date.today()的所有归档请求,需要重写get方法,在get方法中调用get_dated_items()方法,列表展示
DateDetailView:处理URL中包括'../year/month/day'的单个对象详情请求,需要重写get方法,在get方法中调用get_dated_items()方法,展示单个对象
JsonResponse混合
from django.http import JsonResponse class JSONResponseMixin: """ 混合类:返回JsonResponse """ def render_to_json_response(self, context, **response_kwargs): return JsonResponse( self.get_data(context), **response_kwargs ) def get_data(self, context): """ 返回一个将被JSON .dumps()序列化为JSON的对象。 注意:这太天真了;事实上,你需要 做更复杂的处理,以确保任意 对象——比如Django模型实例或queryset ——可以序列化为JSON。 """ return context
用法1:
from django.views.generic import TemplateView class JSONView(JSONResponseMixin, TemplateView): def render_to_response(self, context, **response_kwargs): return self.render_to_json_response(context, **response_kwargs)
用法2:
from django.views.generic.detail import SingleObjectTemplateResponseMixin class HybridDetailView(JSONResponseMixin, SingleObjectTemplateResponseMixin, BaseDetailView): def render_to_response(self, context): # Look for a 'format=json' GET argument if self.request.GET.get('format') == 'json': return self.render_to_json_response(context) else: return super().render_to_response(context)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基于类的视图允许你使用不同的类实例方法响应不同 HTTP 请求方法,而不是在单个视图函数里使用有条件分支的代码。
基于类的视图有一个 as_view()
类方法,
当一个请求到达的 URL 被关联模式匹配时,这个类方法返回一个函数。
这个函数创建一个类的实例,调用 setup()
初始化它的属性,然后调用 dispatch()
方法。
dispatch
观察请求并决定它是 GET
和 POST
,等等。如果它被定义,那么依靠请求来匹配方法,否则会引发 HttpResponseNotAllowed
。
类属性在很多基于类的始终很常见,这里有两种方法来配置或设置类属性
1.在子类中覆盖属性和方法
2.在 URLconf 中将配置类属性作为参数来调用 as_view()
。
装饰器:
1.在URLconf中装饰
2.将装饰器应用到类的dispatch()方法,需要先将函数装饰器转换为方法装饰器
3.装饰类,用name传递要被装饰的方法名:
4.装饰器叠加,以下两种方式是等价的
--------------