Django之class-base view

Django提供的class-base view

	View:基础的View,实现了基于HTTP方法的分发逻辑,不同的请求方法会调用相应的方法,
	即GET请求调用get方法,POST请求调用post方法
	TemplateView:继承自View,可以直接用来返回指定的模板,实现了get方法,可以传递变量
	到模板中来进行数据展示
	DetailView:继承子View,实现了get方法,可以通过绑定某一个模板,用来获取单个实例的
	数据
	ListView:继承子View,实现了get方法,可以通过绑定模板来批量获取数据

View
基于类的视图具有一个 as_view()类方法,该方法返回一个函数,当请求到达匹配的URL时,可以调用该函数。该函数创建类的实例,调用 setup()初始化其属性,然后调用其dispatch()方法。 dispatch查看请求以确定它是否为GET, POST等等,并将请求中继到匹配方法

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):    
        return HttpResponse('result')
    def post(self, request):
    	return HttpResponse('result')
----------  urls 中的设置   ----------
	from django.urls import path
	from myapp.views import MyView
	
	urlpatterns = [
	    path('about/', MyView.as_view()),
	]

View的方法流程

	classmethodas_view(** initkwargs)
	返回一个可调用的视图,该视图接收请求并返回响应:response = MyView.as_view()(request)

	setup(request,* args,** kwargs)
	在dispatch()执行之前初始化实例属性:self.request,self.args,和self.kwargs。
	
	dispatch(request, *args, **kwargs)
	用来判断当前请求是否是受支持的HTTP请求,受支持的请求如下:
	http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
	
	http_method_not_allowed(request, *args, **kwargs)
	如果使用了不受支持的HTTP请求,就会执行此方法,返回错误信息
	
	options(request, *args, **kwargs)
	处理对http请求的响应。返回一个view允许的HTTP请求方式且包含一个list的标头的response
	Returns a response with the Allow header containing a list of the view’s allowed HTTP method names.

TemplateView
继承自以下几个视图

	django.views.generic.base.TemplateResponseMixin
	django.views.generic.base.ContextMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_context_data()
	获取渲染到模板中的所有上下文。如果有新增数据,可以通过重写该方法来实现

使用示例

	from django.views.generic.base import TemplateView
	from articles.models import Article

	class HomePageView(TemplateView):
	    template_name = "home.html"
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['latest_articles'] = Article.objects.all()[:5]
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from myapp.views import HomePageView

	urlpatterns = [
   		path('', HomePageView.as_view(), name='home'),
	]
	-------------- 直接在url中指定模板---------------
		from django.urls import path
	from myapp.views import HomePageView

	urlpatterns = [
   		path('', HomePageView.as_view(template_name="home.html"), name='home'),
	]

ListView
继承自以下几个视图

	django.views.generic.list.MultipleObjectTemplateResponseMixin
	django.views.generic.base.TemplateResponseMixin
	django.views.generic.list.BaseListView
	django.views.generic.list.MultipleObjectMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_template_names()
	返回呈现模板时要搜索的模板名称列表。将使用找到的第一个模板。
	如果使用了template_name,则会搜索template_name。
	
	get_queryset()
	用来获取数据,如果设置了queryset,则会直接返回queryset
	
	get_context_object_name()
	返回将用于包含此视图正在操作的数据列表的上下文变量名称。如果 object_list是Django对象
	的查询集并且 context_object_name未设置,则上下文名称将是组成查询model_name集的模型
	的名称,并附加'_list' 后缀。
	
	get_context_data()
	返回用于显示对象列表的上下文数据
	
	get()
	
	render_to_response()
	返回一个self.response_class实例。如果提供了任何关键字参数,它们将被传递给响应类的
	构造函数。调用get_template_names()以获取将搜索的模板名称列表,以查找现有模板。

使用示例

	from django.utils import timezone
	from django.views.generic.list import ListView
	from articles.models import Article
	
	class ArticleListView(ListView):
	    model = Article
	    paginate_by = 100  # 设置每一页显示几个
	
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['now'] = timezone.now()
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from article.views import ArticleListView
	
	urlpatterns = [
	    path('', ArticleListView.as_view(), name='article-list'),
	]

DetailView
继承自以下几个视图

	django.views.generic.detail.SingleObjectTemplateResponseMixin
	django.views.generic.base.TemplateResponseMixin
	django.views.generic.detail.BaseDetailView
	django.views.generic.detail.SingleObjectMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_template_names()
	get_slug_field()
	返回用于通过slug查找的slug字段的名称。默认情况下,这只返回值slug_field。
	get_queryset()
	get_object()
	get_context_object_name()
	get_context_data()
	get()
	render_to_response()

使用示例

	from django.utils import timezone
	from django.views.generic.detail import DetailView
	from articles.models import Article
	class ArticleDetailView(DetailView):

	    model = Article
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['now'] = timezone.now()
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from article.views import ArticleDetailView
	urlpatterns = [
    	path('/', ArticleDetailView.as_view(), name='article-detail'),
	]

你可能感兴趣的:(django学习)