• 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>
  • 相关阅读:
    Datagrip导入导出为一个sql文件详细说明 (mysql)
    Linux/Unix/Mac OS下的远程访问和文件共享方式
    批量杀掉多个pid文件中记录的pid进程, 并集成到shell脚本中
    把tomcat服务器配置为windows服务的方法
    idea导入java项目
    linux-umount挂载点无法卸载:device is busy(解决)
    elasticsearch插件大全
    分布式搜索elasticsearch配置文件详解
    centos fastdfs 多服务器 多硬盘 多组 配置详解
    redis 配置 linux
  • 原文地址:https://www.cnblogs.com/40kuai/p/8022351.html
Copyright © 2020-2023  润新知