专栏首页菲宇diango之基于内置视图CBS编程

diango之基于内置视图CBS编程

Class-based views是Django为解决建站过程中的常见的呈现模式而建立的。具有如下几个原则:

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

1. 使用django自身的cbvs

cbvs是可扩展的,但在也增加了复杂度,有时甚至出现8个import引入关系。django自带的view如下表所示:

类名

功能

例子

View

基本View, 可以在任何时候使用

见后面详细介绍

RedirectView

重新定向到其他URL

将访问"/log-in/"的用户重新定向到"/login/"

TemplateView

显示Django HTML template

一般网站中使用模板显示的页

ListView

显示对象列表

文章列表页

DetailView

显示对象详情

文章详细页

FormView

提交From

网站联系我们或emai订阅form

CreateView

创建对象

创建新文章页

UpdateView

更新对象

修改文章页

DeleteView

删除对象

删除文章页

Generic date views

显示一段时间内的对象

按时间归类的博客

2. View中基本元素

 1 class ModelCreatView(CreateView):
 2     def __init__(self, model, template_name, context_object_name, success_url, success_msg, fields):
 3         """
 4         初始化函数,这里以creatview为例,其他view大同小异
 5         :param model:  对应要操作的模型
 6         :param template_name: 对应的模板名称,一般为html页面
 7         :param context_object_name: 返回给前台的对象
 8         :param success_url: 操作成功定向地址
 9         :param success_msg: 返回的成功信息
10         :param fields: 需要操作的对应的模型中的属性
11         """
12         self.model = model 
13         self.template_name = template_name
14         self.context_object_name = context_object_name
15         self.success_url = success_url
16         self.success_msg = success_msg
17         self.fields = fields
18     # 
19     # self.model = MODEL
20     # self.fields = ['event_attribute', 'role_attribute', 'entiry_value', 'event_type', 'direction_flag', 'unique_flag',
21     #                'appear_flag']
22     # self.context_object_name = 'knowledgeGraph'
23     # self.success_url = '/knowledgeGraph/'
24     # self.template_name = 'knowledge_graph/add.html'

3. ListView简介

listview是一个展示列表的view,返回的是一个template,包含两个关键方法:

def get_context_data(self, **kwargs):
def get_queryset(self):

第一个方法返回一个字典给前端,包括分页信息,列表信息,已经其他自定义的信息;第二个方法返回数据库中获取到的数据(可能经过条件迭代),具体实现的实例代码如下:

 1     def get_context_data(self, **kwargs):
 2         """
 3         用来获取返回给前端页面的dict数据,前端页面可直接通过应用dict中的key来获取value
 4         :param kwargs:
 5         :return: context,一个字典类型的数据
 6         """
 7         try:
 8             context = super(ModelListView, self).get_context_data(**kwargs)
 9             log.debug("get_context_data")
10             page_obj = context['page_obj']
11             pages = []
12             for i in range(1, page_obj.paginator.num_pages + 1):
13                 if i == 1 or i == page_obj.paginator.num_pages:
14                     pages.append(i)
15                 elif i >= page_obj.number - 2 and i <= page_obj.number + 2:
16                     pages.append(i)
17                 elif pages[-1] != None:
18                     pages.append(None)
19                 else:
20                     pass
21             context['pages'] = pages
22             context['order_type'] = self.order_type
23             context['length'] = len(self.object_list)
24             if 'pagination_num' not in context:
25                 context['pagination_num'] = self.paginate_by
26             self.echo_search(context)
27             if self.model == NodeData:
28                 context['tree'] = self.get_tree()
29             return context

4. Mixin实现

view中如果觉得自带的post、get方法不够好,也可以重写post、get方法,这样就与函数式编程没有什么区别。有时需要前后端异步方式加载数据,就需要使用ajax来完成,这时就可以使用mixin来解决。

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

  • Django自身提供的View永远在最右边
  • mixin依次在以上view的左边
  • mixin永远继承自Python的object类型
  • 推荐mixin库django-braces
class ModelValidView(LoginRequiredMixin, AjaxResponseMixin, View):
    def __init__(self, model):
        self.model = model
    def post_ajax(self, request, *args, **kwargs):
        pass

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • redis缓存数据库

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应...

    菲宇
  • python模块:win32com用法详解

    import win32com from win32com.client import Dispatch, constants

    菲宇
  • 【十四】python面向对象之类的字、方法和属性

    注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存...

    菲宇
  • CRM客户关系管理系统(十三) 第十三章、用户自定义认证第十四章、万能通用权限框架设计

    zhang_derek
  • 换脸原理,使用GAN网络再造ZAO应用:可变自动编解码器基本原理

    从本节开始,我们介绍一种人工智能实现无缝变脸的网络名为可变自动编解码器,英文名称:variational autoencoder。在前面章节中我们曾介绍过,很多...

    望月从良
  • 用Python实现数据结构之链表

    链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是...

    py3study
  • Oracle应用之批量递增更新数据脚本

    需求:更新用户表的工号,格式为“GD1,GD2,…”的格式,如果有数据取最大值再递增

    SmileNicky
  • 学习&科研必备的几个实用工具推荐(排版、绘图、查错)

    继上一篇文章《AI领域:如何做优秀研究并写高水平论文?》得到了很多伙伴的认可,为此专门写了一篇AI领域论文写作中使用的工具总结,这是我自己在写作过程中用的比较顺...

    AI算法与图像处理
  • 基于Django的电子商务网站开发(连载16)

    (1)通过循环语句formylist in self.mylists:遍历所有测试用例。

    小老鼠
  • Python基础之函数等等

    需要删除:? 需要新建:? 需要更新:?  注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新

    程序员同行者

扫码关注云+社区

领取腾讯云代金券