Django Class Views

时间:2024-04-28 13:35:48

一、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>