在上一篇中在本地进行初始化,并让项目顺利运行。在本篇中将实现一个线索管理模块,支持线索的增删改查。

新建线索应用模块

进入项目目录,使用django命令创建线索应用模块,命令如下:

$ python manage.py startapp leads

执行成功后将会看到新增了一个目录,结构如下:

leads

├── __init__.py

├── admin.py

├── apps.py

├── migrations

│ └── __init__.py

├── models.py

├── tests.py

└── views.py

这个目录结构包含了模型、视图、路由、测试等内容,默认是在项目根目录下面,为了和项目的风格保持一致,需要进行下面的操作。将目录移动到one_crm目录下面;

编辑leads下面的apps.py,将其中name改成"one_crm.leads";

将“one_crm.leads.apps.LeadsConfig”添加到config/settings/base.py文件的LOCAL_APPS变量中,使这个模块生效。

下面开始实现模型、视图、模板和路由等。

创建模型

模型是一个Python对象,它包含了数据的字段和操作方法。通常,每个模型映射为一张数据库中的表。模型是真实数据的简单明确的描述。它包含了储存的数据所必要的字段和行为。Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。

Django 模型使用自带的 ORM。 对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。 ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。 ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

这里定义一个线索包含名字、职称、电话、邮箱、描述、附件、创建时间、更新时间这几个字段,更新如下内容到models.py(如无说明,文件都是在leads文件夹下面的该文件):

class Lead(models.Model):

name = CharField("名字", max_length=255)

title = CharField("职称", max_length=255)

contact = CharField("联系方式", max_length=255)

email = EmailField("邮箱")

description = TextField("描述")

attachment = FileField("附件", upload_to="upload")

create_time = DateTimeField("创建时间", auto_now_add=True)

update_time = DateTimeField("上次更新时间", auto_now=True)

def __str__(self):

return self.name

创建模型之后需要更新数据库结构,先生成migrations。在Django应用中,migrations是一系列文件,位于Django应用的migrations目录下,用以存储Django应用中的model类的变化。 每次在Django应用中对model类的修改,都会对应一个migration文件。 一个migration文件与数据库结构的schema的一个版本对应。

执行命令:

$ python manage.py makemigrations leads

然后python manage.py migrate命令更新数据库。

创建视图

Django的一个设计理念就是DRY,它提供了丰富的基础类视图可以帮开发者轻松快速的实现需要的功能。Django类视图具有如下几个原则:

1.代码越少越好

2.永远不要重复代码

3.视图当只包含呈现逻辑, 不应包括业务逻辑

4.保持view逻辑清晰简单

常见的类视图如下:

类名功能View基本View, 可以在任何时候使用ListView显示对象列表DetailView显示对象详情CreateView创建对象UpdateView更新对象DeleteView删除对象

这里使用ListView、DetailView、CreateView、UpdateView、DeleteView实现增删改查的功能,更新views.py代码如下:

class LeadCreateView(CreateView):

"""

新建视图

"""

model = Lead

fields = ["name", "title", "contact", "email", "description", "attachment"]

lead_create_view = LeadCreateView.as_view()

class LeadUpdateView(UpdateView):

"""

更新视图

"""

model = Lead

fields = ["name", "title", "contact", "email", "description", "attachment"]

lead_update_view = LeadUpdateView.as_view()

class LeadDeleteView(DeleteView):

"""

删除视图

"""

model = Lead

success_url = reverse_lazy('leads:lead-list')

lead_delete_view = LeadDeleteView.as_view()

...

其中CreateView和UpdateView的子类要么设置 form_class,要么设置 fields,这里设置fields字段。

建立模板

使用类视图进行开发,每个视图默认会读取该模型加特定后缀的模板名,比如这里的LeadCreateView和LeadUpdateView读取的是lead_form.html,LeadListView读取的是lead_list.html,LeadDetailView读取的是lead_detail.html,LeadDeleteView读取的是lead_delete_confirm.html。模板实现基本上就是html,比较简单,这里不展开描述。这里值得一提的是django-crispy-forms这个库,使用它可以很方便的用bootstrap样式美化表单。Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端样式框架。只需要写HTML标签调用它的类你就可以很快速的做一个高大上的网页,而且不用担心兼容问题。

配置路由

完成了上面部分后就可以将线索模块配置到路由中让它在页面中正常使用,更新urls.py为如下内容:

...

app_name = "leads"

urlpatterns = [

path('add/', lead_create_view, name='lead-add'),

path('/', lead_detail_view, name='lead-detail'),

path('/update/', lead_update_view, name='lead-update'),

path('/delete/', lead_delete_view, name='lead-delete'),

path('', lead_list_view, name='lead-list'),

]

最后在config文件夹下的urls.py文件中urlpatterns变量中加入下面一行就可以了:

path("leads/", include("one_crm.leads.urls", namespace="leads")),

效果如下:

python写一个crm系统_用Python打造一个CRM系统(四)相关推荐

  1. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  2. 怎么用python写脚本刷金币_【python入门】之教你编写自动获取金币脚本

    最近看到个特别全面源码分享网站,刚好有个项目是一直想做但是没有头绪的,就想下载学习一下.注册账号后,发现还需要若干金币.后来发现可以通过每隔一定时间发心情状态来获得金币,就打算写一个自动发心情状态的 ...

  3. 用python写跑酷游戏脚本_用python写游戏之2D跑酷游戏(二)

    这篇文章介绍2D跑酷游戏中,添加地板资源, 给主角附加重力作用,以及添加游戏控制器和游戏场景的切换. 废话不多说,直接开始. 添加地板资源 定义地板类,继承自pygame.sprite.Sprite ...

  4. python写抢火车票软件_用 Python 代码自动抢火车票

    市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅供参考,主要用于大家沟通 ...

  5. python写地下城脚本下载_在python下写脚本的方法

    在python下写脚本的方法 发布时间:2020-07-18 11:43:36 来源:亿速云 阅读:68 作者:清晨 这篇文章主要介绍在python下写脚本的方法,文中介绍的非常详细,具有一定的参考价 ...

  6. 如何用python写查询名字程序_用Python写个迷你出门问问|10几行代码搞定

    上一篇讲了JSON文件的用法,小伙伴们感觉好像写的很不过瘾,后台有好几个小伙伴问我能不能再写一篇,其中还有两个小伙伴给我留言,问我什么是Web Api,好今天我会解释一下,同时利用百度开放的API写一 ...

  7. 怎么用python写脚本刷金币_用Python写王者荣耀刷金币脚本

    王者荣耀很多朋友都想买脚本和挂之类的,想更加容易的获得金币等可以在游戏里买英雄等,今天我们发挥程序员的优势教给大家用Python语言自己写一个可以刷金币的脚本,以下是全部内容. 王者荣耀的冒险模式里有 ...

  8. python写小说阅读器_用python实现自己的小说阅读器!

    前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而且整本 ...

  9. python写出雷霆战机_利用Python自制雷霆战机小游戏,娱乐编程,快乐学习!

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 先睹为快 在cmd ...

  10. python写小说阅读器_用python给自己DIY一款小说阅读器,如此看来,很简单!

    前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而且整本 ...

最新文章

  1. 【带你重拾Redis】Redis 主从架构
  2. 配置maven nenux仓库
  3. 黄忠---忠心不二主
  4. PHP使用session_set_save_handler陷阱
  5. Android编译默认英语,Android 编译系统 (一)
  6. 前端代码异常日志收集与监控
  7. 构建根文件系统之busybox
  8. Python密码强度判断
  9. vue事件.navtive 的使用
  10. iPad的屏幕大小是多少?
  11. LeetCode刷题(158)~从尾到头打印链表【递归|辅助栈】
  12. Chat GPT原理
  13. Windows 清除DNS缓存C++实现
  14. 【数字】求特定三位数
  15. Python 毕设精品实战案例——快速索引目录
  16. Android通过gradle实现debug和release包名不同
  17. winSCP 集成PuTTY附下载
  18. You are 87% Sagittarius
  19. linux生成mux节点,mux - 路由
  20. 苹果手机如何设置铃声

热门文章

  1. 继三星之后 华为折叠屏手机Mate X发售日期或将延期至9月
  2. Apple Watch再立功!67岁男子意外摔倒后得救
  3. 让ubuntu开机快一点:记开机出现Waiting for network configuration...
  4. 有关Oracle最大连接数的问题
  5. sourcetree 推送找不到bash.exe_找旅伴 | 周末轻旅行
  6. 【Spring】Spring Security OAuth2 JWT 认证
  7. 【Flink】Flink SQL Cannot instantiate user function cannot assign instance LinkedMap FlinkKafkaConsum
  8. 【Flink】Flink Flink 1.14 新特性预览
  9. 【Flink】Flink Not all required tasks are currently running
  10. 【Elasticsearch】elasticsearch allocation 分析