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'),
]