Django Class Views

一、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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值