类视图

类视图

使用原则

  • 代码越少越好
  • 永远不要重复代码
  • View应当只包含呈现逻辑, 不应包括业务逻辑
  • 保持view逻辑清晰简单
  • 不要将CBVs用作403, 404, 500的错误处理程序
  • 保持mixin简单明了

mixin

在编程中mixin是指为继承它的class提供额外的功能, 但它自身却不能单独使用的类

在具有多继承能力的编程语言中, mixin可以为类增加额外功能或方法. 在Django中, 我们可以使用mixin为CBVs提供更多的扩展性, 当然在类继承过程中, 我们推荐以下原则:

  • Django自身提供的View永远在最右边
  • mixin依次在以上view的左边
  • mixin永远继承自Python的object类型

Django mixin库:https://github.com/brack3t/django-braces/tree/master/braces/views

常用的类视图

View                    基本View 可以在任何时候使用 见后面详细介绍
RedirectView            重新定向到其他URL 将访问"/log-in/"的用户重新定向到"/login/"
TemplateView            显示Django 模板 一般网站中使用模板显示的页
ListView                显示对象列表 文章列表页
DetailView              显示对象详情 文章详细页
FormView                提交From 网站联系我们或emai订阅form
CreateView              创建对象 创建新文章页
UpdateView              更新对象 修改文章页
DeleteView              删除对象 删除文章页
Generic date views      显示一段时间内的对象 按时间归类的博客

View

django.views.generic.base.View

基于类的基础视图的核心。其它所有的基于类的视图都继承自这个基础类。

from django.shortcuts import render,HttpResponse
from django.views.generic import View
class Index(View):
    """
    class django.views.generic.base.View
    基于类的基础视图的核心。其它所有的基于类的视图都继承自这个基础类

    URL配置: url(r‘^index/(\d+)‘, Index.as_view(state=0)),
    """
    # as_view参数
    state = None
    # 该视图接收的HTTP方法
    http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘,]
    def dispatch(self, request, *args, **kwargs):
        print("请求之前执行")
        obj = super(Index,self).dispatch(request, *args, **kwargs)
        print("请求之后执行")
        return obj
    def get(self, request,id):
        print(self.state)
        print(id)
        return HttpResponse("GET")
    def post(self, request):
        return HttpResponse("POST")

TemplateView

从以下视图继承方法和属性

  1. django.views.generic.base.TemplateResponseMixin
  2. django.views.generic.base.ContextMixin
  3. django.views.generic.base.View

示例

from django.views.generic.base import TemplateView
class HomePageView(TemplateView):
    """
    django.views.generic.base.TemplateView
    渲染一个给定的模板,包含上下文和从URL捕获的参数。

    URL配置: url(r‘^home/‘, HomePageView.as_view(template_name=‘about.html‘)),
            此处的 `template_name` 可以覆盖视图中的 `template_name`的值
    """
    template_name = "home.html"
    def dispatch(self, request, *args, **kwargs):
        print("模板渲染前")
        obj = super(HomePageView,self).dispatch(request, *args, **kwargs)
        print("模板渲染后")
        return obj
    # 用于添加额外的上下文对象
    def get_context_data(self, **kwargs):
        context = super(HomePageView, self).get_context_data(**kwargs)
        context[‘latest_articles‘] = [‘金融‘,‘IT‘,‘杂谈‘]
        # context[‘user_list‘] = models.UserInfo.objects.all()
        print("渲染模板")
        return context

RedirectView

从以下视图继承方法和属性:

  1. django.views.generic.base.View

示例

from django.views.generic.base import RedirectView
class ArticleRedirectView(RedirectView):
    """
    django.views.generic.base.RedirectView
    重定向到一个给定的URL。
    URL配置:
        url(r‘^aaa/‘, views.ArticleRedirectView.as_view(url=‘/ccc‘)),
        url(r‘^bbb/‘, views.bbb,name=‘article-detail‘),
        url(r‘^ccc/‘, views.ccc,name=‘ccc‘),
    """
    url = None
    permanent = False  # True: 重定向状态码301; False: 重定向状态码302
    query_string = True  # 是否将GET 的查询字符串一起传递给新的地址.
        # True: /aaa?id=1  --->  /ccc?id=1
        # False: /aaa?id=1 --->  /ccc/
    pattern_name = ‘article-detail‘  # 如果没有定义 `url参数`,使用改参数重定向
    def dispatch(self, request, *args, **kwargs):
        print("重定向前")
        obj = super(ArticleRedirectView,self).dispatch(request, *args, **kwargs)
        print("重定向后")
        return obj
    # 构造重定向的目标URL
    def get_redirect_url(self, *args, **kwargs):
        print("重定向")
        return super(ArticleRedirectView, self).get_redirect_url(*args, **kwargs)

DetaliView

DetailView是对这些出版商的诸多的object中的一个进行详细解析,它获得的主数据是一个object。

从以下视图继承方法和属性:

  1. django.views.generic.detail.SingleObjectTemplateResponseMixin
  2. django.views.generic.base.TemplateResponseMixin
  3. django.views.generic.detail.BaseDetailView
  4. django.views.generic.detail.SingleObjectMixin
  5. django.views.generic.base.View

示例

from django.contrib.auth.mixins import LoginRequiredMixin
from chouti.models import UserInfo
class UserDetailView(DetailView):
    """
    django.views.generic.detail.DetailView
    执行这个视图的时候,self.object 包含视图正在操作的对象(models)
    URL配置: url(r‘^(?P<user_id>\d+)$‘,views.UserDetailView.as_view()),
    """
    model = UserInfo
    template_name = ‘user.html‘  # 模板
    pk_url_kwarg = ‘user_id‘  # PublisherDetail.objects.filter(pk=user_id)

    def get_context_data(self, **kwargs):
        print("get_context_data")
        print(self.object.username)
        # 获取上下文对象,
        context = super(UserDetailView, self).get_context_data(**kwargs)
        context[‘now‘] = [33, 44]   # 添加额外的上文对象
        return context

ListView

对于ListView来说,它需要显示的是多个object的信息,返回的是一个对象列表

它的数据来源是model和queryset这两个属性:

  1. model:获取这个model相关的所有数据
  2. queryset:从这个queryset中获取指定的数据。
  3. queryset的优先级高于model
  4. 它所获取的数据是通过context中object_list这个变量来传递的

从以下视图继承方法和属性:

  1. django.views.generic.list.MultipleObjectTemplateResponseMixin
  2. django.views.generic.base.TemplateResponseMixin
  3. django.views.generic.list.BaseListView
  4. django.views.generic.list.MultipleObjectMixin
  5. django.views.gen

示例

from blog.models import Post
from django.views.generic import ListView
class PublisherList(ListView):
    """
    django.views.generic.list.ListView
    对于ListView来说,它需要显示的是多个object的信息,返回的是一个对象列表
    URL配置: url(r‘^publishers/(?P<match_title>\w+)$‘,views.PublisherList.as_view()),
    """

    # 数据来源是`model`和`queryset`, 后者优先级较高
    model = Post   # 返回所有对象
    queryset = Post.objects.filter(title__contains = ‘c‘)  # 返回 title包含"c"的对象
    context_object_name = ‘publisher‘  # 没有指定此参数时,上下文对象是 `object_list`
    template_name=‘post.html‘   # 模板
    # 实现动态过滤,捕获urls中的参数
    def get_queryset(self):
        print("get_queryset")
        return Post.objects.filter(title__contains = self.kwargs[‘match_title‘])

    # 用于添加额外的上下文对象
    def get_context_data(self, **kwargs):
        print("get_context_data")
        context = super(PublisherList, self).get_context_data(**kwargs)  # 获取上下文对象
        context[‘nn‘] = [‘11‘, ‘22‘]   # 把{‘nn‘:[‘11‘, ‘22‘]}添加到上下文对象
        return context
时间: 2024-10-26 23:41:19

类视图的相关文章

在DJANGO的类视图中实现登陆要求和权限保护

以前接触的是基于函数的保护,网上材料比较多. 但基于类视图的很少. 补上! Decorating class-based views 装饰类视图 对于类视图的扩展并不局限于使用mixin.你也可以使用装饰器. Decorating in URLconf URLconf中的装饰器 最简单的装饰类视图的方式是装饰 as_view() 方法返回的结果.最容易装饰的地方是你配置你的视图的地方URLconf中: from django.contrib.auth.decorators import logi

用宏定义成员函数,VC6的类视图显示错误

用宏定义成员函数,VC6的类视图显示错误,实际函数可以使用. VC7没此问题. #define ConstGetMemFunMac2(varName,funName,retType)\ retType funName()const{return varName;}; class A { public: ConstGetMemFunMac2(m_x,GetX,int); int m_x; };

Visual studio 类视图和资源视图不显示的问题

关于Visual studio 类视图和资源视图不显示的问题 解决方法: 1. 工具—选项—文本编辑器—C/C++—高级,浏览/导航下的禁用数据库选项置为False; 2. 输入命令:devenv /resetsettings, 重置Visual studio 所有设置参数.

unity3d 周期图、类视图、Transfor结构图

unity3d 周期图.类视图.Transfor结构图

visual studio2010 “类视图”和“对象浏览器”图标

“类视图”和“对象浏览器”显示一些图标,这些图标表示代码实体,例如命名空间.类.函数和变量. 下表以图文并茂的形式说明了这些图标. 图标 说明 图标 说明 namespace 方法或函数 类 运算符 接口 Property 结构 字段或变量 Union event Enum 常量 TypeDef 枚举项 模块 映射项 内部 外部声明 delegate 宏 异常 模板 映射 未知或错误 Global 类型转发 扩展方法 信号图标 以下信号图标适用于前面的所有图标,指示它们的可访问性. 注意 如果项

django rest_framework入门四-类视图APIView

上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代@api_view装饰器,代码如下: from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from snippe

六、Django之表单和类视图-Part 4

一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.question_text }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <form action="{% url 'p

Django框架的使用教程--类视图-中间间-模板[六]

类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, request): return render(request, 'index.html') def post(self, request): return render(request, 'show.html') 路由 url(r'^class_view/$', views.class_view.as_view()),

Django 通用类视图

引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: from django.urls import path from django.views.generic import TemplateView urlpatterns = [ path('about/', TemplateView.as_view(template_name="about.h