django-基于类的视图

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.装饰器叠加,以下两种方式是等价的

 --------------

原文地址:https://www.cnblogs.com/staff/p/12454627.html