在上一篇中在本地进行初始化,并让项目顺利运行。在本篇中将实现一个线索管理模块,支持线索的增删改查。
进入项目目录,使用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"
;下面开始实现模型、视图、模板和路由等。
模型是一个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")),
完整代码地址:https://github.com/flingjie/one_crm