一、Base views
View
class django.views.generic.base.
View
主要的基于类的基本视图。所有其他基于类的视图都从这个基类继承而来。它不是一个通用的视图,因此也可以从django.views中
导入
- 方法流程图
dispatch()
http_method_not_allowed()
options()
- 示例(views.py)
from django.http import HttpResponse from django.views import View class Base_View(View): def get(self, request, *args, **kwargs): return HttpResponse('Hello, World!')
- 示例(urls.py)
from django.conf.urls import url from myapp.views import MyView urlpatterns = [ url(r'^view/$', Base_View.as_view(), name='base_view'), ]
- 属性:http_method_names
该属性为可以接受的http请求的类型的列表:默认为 ['get','post','put','patch','delete','head','options','trace']
- 方法:as_view(cls,**initkwargs):
返回接受请求并返回响应的可调用视图
response = Base_View.as_view()(request)
dispatchtp_meth(request,*args,**kwargs):
通过用户的请求方式,getattr对应的方法来处理,没有相应的方法或该方法不在http_method_names中交由http_method_not_allowed方法处理,返回错误信息。
http_method_not_allowed(request,*args,**kwargs):
返回请求错误的提示信息,通过http.HttpResponseNotAllowed方法
options(request,*args,**kwargs):
处理对OPTIONS HTTP动词请求的响应。返回Allow包含视图允许的HTTP方法名称列表的响应。
TemplateView
class django.views.generic.base.
TemplateView
呈现指定的模板,也会传入上下文和URLconf传递的任何关键字参数。
- 该视图继承了以下视图的属性和方法:
django.views.generic.bash.TemplateResponseMixin
django.views.generic.bash.ContextMixin
django.views.generic.bash.View
- 方法流程图
dispatch()
http_method_not_allowed()
get_context_data()
- 示例(views.py)
class Tem_View(TemplateView): # 在URLconf中配置的参数会覆盖在类中的关键字配置,所有这里的指定模板名称可有可无 template_name = "helei/tem_vies.html"
- 示例(urls.py)
from django.conf.urls import url from helei import views urlpatterns = [ # 这两种配置的差别你懂得 # url(r'^tem/', views.Tem_View.as_view(template_name = "helei/tem_vies.html"),name='tem'), url(r'^tem/', views.Tem_View.as_view(),name='tem'), ]
- 其他说明:get_context_data()
可以重写该方法来给前端传递上下文来进行模板的渲染,实例如下:
##### views.py class Tem_View(TemplateView): template_name = "helei/tem_vies.html" def get_context_data(self, **kwargs): context = super(Tem_View,self).get_context_data(**kwargs) context['pro_info_obj'] = models.Porject_Info.objects.all() return context ##### helei/tern_views.html {% for project in pro_info_obj %} <ul> <li>{{ project.project_name }}</li> <li>{{ project.project_path }}</li> <li>{{ project.project_port }}</li> </ul> {% endfor %}
Django2.0在as_view()中可以指定extra_context来在上下文中添加一个字典,链接
实例:from django.views.generic import TemplateView
TemplateView.as_view(extra_context={'title':'Custom Title'})
RedirectView
class django.views.generic.base.RedirectView
重定向到给定的URL,它将根据URL中获取的参数进行插值。URL中的任何‘%’字符串都必须写成‘$$’以便python 将其转换为输出中的单个百分号
如果给定的URL是None,Django将返回HttpResponseGone(401)
- 该视图继承了以下视图的属性和方法
django.views.generic.base.View
- 方法流程图
dispatch()
http_method_not_allowed()
get_redirect_url()
- 示例(views.py)
from django.views.generic.base import RedirectView from django.shortcuts import get_object_or_404 from helei import models class Tem_Redirect_View(RedirectView): permanent = False query_string = True pattern_name = 'tem_detail' # 这个名称的模板后边会提到,在detail view时。 def get_redirect_url(self, *args, **kwargs): print args,kwargs article = get_object_or_404(models.Porject_Info, pk=kwargs['pk']) # article.update_counter() return super(Tem_Redirect_View, self).get_redirect_url(*args, **kwargs)
- 示例(urls.py)
from django.conf.urls import url from django.contrib import admin from helei import views urlpatterns = [ url(r'^tem/', views.Tem_View.as_view(template_name = "helei/tem_vies.html"),name='tem'), url(r'^tem_redirect/(?P<slug>w+)', views.Tem_Redirect_View.as_view(),name='tem_redirect'), url(r'^tem_list/', views.Tem_List_View.as_view(),name='tem_list'), url(r'^tem_detail/(?P<slug>w+)', views.Tem_Detail_View.as_view(),name='tem_detail'), ] # 后两个urlconfif后期会用到
- 属性
url 作为字符串重定向到的URL,如果最后返回的url为None,这会返回410错误。
pattern_name 要重定向到的模板名称,通过from django.urls import reverse 方法对名称进行解析得到URL。
permanent 重定向是否为永久性的,唯一区别是返回的状态码,如果为True,那么状态码为301,如果为False,则返回的状态码为302,默认为False。
query_string 是否将GET查询字符串传递到新的位置,True查询字符串被追加到URL。False则被丢弃,默认为False。
- 方法
get_redirect_url(*args,**kwargs) 构造重定向的目标URL
class Tem_Redirect_View(RedirectView): permanent = False query_string = True pattern_name = 'tem_detail' def get_redirect_url(self, *args, **kwargs): print args,kwargs article = get_object_or_404(models.Porject_Info, pk=kwargs['pk']) # article.update_counter() # 这个存在疑问 return super(Tem_Redirect_View, self).get_redirect_url(*args, **kwargs)
二、Generic display views
通用视图函数使用在显示数据时。
ListView
Class django.views.generic.list.ListView
当视图执行时,self.object_list将包含一个对象列表,返回一个上下文供前端模板使用
- 该视图继承了一下视图的方法和属性
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
- 方法流程图
dispatch()
http_method_not_allowed()
get_template_names()
get_queryset()
get_context_object_name()
get_context_data()
get()
render_to_response()
- 示例(views.py)
class Tem_List_View(ListView): paginate_by = 1 # 分页每页显示的数据条数,page=n 进行翻页 # page_kwarg = 'fanye' # 默认翻页为page,可以指定 model = models.Porject_Info # 返回那个库的数据 # context_object_name = 'host_info' # 上下文字段,默认为 ordering = 'project_port' # 根据该字段进行排序 template_name_suffix = 'list' # 指定模板的后缀,默认就是list # template_engine = "" # 指定模板引擎 没看懂 # template_name = '////' # 指定模板,默认会根据models、models的appname和template_name_suffix生成模板路径和名称,前端返回的上下文为object_list和template_name
- 示例(urls.py)
from django.conf.urls import url from django.contrib import admin from helei import views urlpatterns = [ url(r'^tem_list/', views.Tem_List_View.as_view(),name='tem_list'), ]
- 示例(project_info_list.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>Porject List</h2> <ul> {% for project in object_list %} <li>{{ project.project_name }}</li> {% endfor %} </ul> </body> </html>
DetailView
Class django.views.generic.detail.DetailView
当这个函数执行时,self.object将包含视图正在操作的对象。
- 该视图继承了以下视图的方法和属性
django.views.generic.detail.SingObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMinix
django.views.generic.detail.BaseDetailView
django.views.generic.detail.SingleObjectMixin
django.views.generic.base.View
- 方法流程图
dispath()
http_method_not_allowed()
get_template_names()
get_slug_field()
get_queryset()
get_object()
get_context_object_name()
get_context_data()
get()
render_to_response()
- 示例(views.py)
class Tem_Detail_View(DetailView): model = models.Porject_Info slug_field = "project_port" slug_url_kwarg = "project_port" # 这个字段和前端传递的字段相同
context_object_name = "project_obj" # 自定上下文字段,和object共存。
- 示例(urls.py)
from django.conf.urls import url from django.contrib import admin from helei import views urlpatterns = [ url(r'^tem_detail/(?P<project_port>w+)', views.Tem_Detail_View.as_view(),name='tem_detail'), ]
- 示例(porject_info_detail.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <li>{{ project_obj.project_name }}</li> <li>{{ project_obj.project_path }}</li> <li>{{ project_obj.project_port }}</li> <li>{{ project_obj.Domain_name }}</li> </body> </html>