内容参考:https://time.geekbang.org/course/intro/100061901
Django适用于那些场景
- 内容管理系统
- 博客
- CMS
- WiKi
- 企业内部系统
- 会议室预订
- 招聘管理
- ERP & CRM
- 报表系统
- 运维管理系统
- CMDB
- 发布管理
- 作业管理
- 脚本管理
- 变更管理
- 故障管理
优点和缺点
- 优点
- Python 实现,代码干净、整洁
- 提供管理后台,能够快速开发
- 复用度高,设计、使用上遵循DRY原则
- 易于扩展复用的中间件
- 内置的安全框架
- 丰富的第三方库
- 缺点
- 单个应用-不易并行开发,单点扩展
- 不适合非常小的几行代码的项目
- 不适合于高并发的to C 互联网项目
Django的MTV架构
Django的设计思想
- DRY(Don’t repeat yourself):不重复造轮子
- MVT
- 快速开发
- 灵活易扩展
- 松耦合
- 显式优于隐式
Django开发环境
python(Anaconda安装,python安装包安装)
开发工具(PyCharm,社区版不支持Django开发,需要安装Django包,安装完后Django的代码会有自动的提示)
Django(conda install django
或pip3 install django
)
第一个项目
###创建会议室管理项目
django-admin startproject meetingroom
cd meetingroom
启动项目
python manage.py runserver 0.0.0.0:8000
0.0.0.0 表示监听本机的所有IP地址
访问项目
访问管理页面
127.0.0.1/admin
如果访问页面出错,有可能是因为还没有初始化整个数据库,所以没法访问;
可以使用python manage.py migrate
创建不同表跟表字段】
重启服务
进图管理页面,如下,需要账号和密码,可以通过admin命令创建一个管理员
python manage.py createsuperuser
输入账号名、邮箱地址、密码,如果密码过于简单会提示
直接跳过即可;
输入账号密码,可以进入管理页面:
配置文件(settings.py)
- DEBUG:默认为True,测试环境下,debug可以看到出错的各种信息,包括异常的信息;生产环境下应该把debug设置为False,否则,用户可以看到各种调试信息,这是很危险的;
- ALLOWED_HOSTS:配置哪些IP地址可以访问应用,默认只有127.0.0.1的端口可以访问,通常情况下并不会在这个配置里面把外网的ip的地址配上来而是用一个网关服务,比如用Nginx、Tengine来做这个网关;
- INSTALLED_APPS:Django项目里面安装的应用,默认安装django.admin、auth、sessions、messages和静态资源文件的应用;
我们创建应用完了之后也要往往APPS配置里面的结尾加上我们的应用; - MIDDLEWARE: 启动中间件;
- TEMPLATES:配置了使用了哪个模板引擎,默认使用DjangoTemplates,模板引擎里面也配置了那上下文处理器;
- DATABASES:配置了使用哪个数据库,默认使用本地的sqllite的数据库;
- LANGUAGE_CODE:配置项目语言,默认是英文‘en-us’,中文为‘zh-hans’
职位管理系统
需要的字段
- 职位名称
- 类别
- 工作地点
- 职位职责
- 职位要求
- 发布人
- 发布日期
- 修改日期
创建一个新的应用
python manage.py startapp jobs
目录中会增加一个jobs应用的文件夹
将应用添加到INSTALLEDA_APPS结尾
在models中定义职位的模型
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
JobTypes = [
(0, "技术类"),
(1, "产品类"),
(2, "运营类"),
(3, "设计类")
]
Cities = [
(0, "北京"),
(1, "上海"),
(2, "深圳")
]
class Job(models.Model):
job_type = models.SmallIntegerField(blank=False, choices=JobTypes, verbose_name="职位类别")
job_name = models.CharField(max_length=250, blank=False, verbose_name="职位名称")
job_city = models.SmallIntegerField(choices=Cities, blank=False, verbose_name="工作地点")
job_reponsibility = models.TextField(max_length=1024, verbose_name="职位职责")
job_requirement = models.TextField(max_length=1024, blank=False, verbose_name="职位要求")
creator = models.ForeignKey(User, verbose_name="创建人", null=True, on_delete=models.SET_NULL) # creator为User的外键引用,指定在数据被删除是把值设置成NULL
created_date = models.DateTimeField(verbose_name="创建日期")
modified_date = models.DateTimeField(verbose_name="修改时间")
启动服务
python manage.py runserver 0.0.0.0:8000
如果没有报错,可以去页面查看
这时可以发现,页面还是只能管理用户和群组,并不能管理Model
将Model注册到管理后台
出现上面的情况是因为我们还没将Model注册到管理后台,需要将Model注册到admin里面;
admin.py
from django.contrib import admin
from jobs.models import Job
admin.site.register(Job)
这时再刷新页面JOBS就出来。
但是点击jobs进去因为没有创建jobs的表,也就是数据库的表还没有同步,所以页面还是出错的;
数据同步
makemigrations 它会创建数据库脚本:
python manage.py makemigrations
Migrations for 'jobs':
jobs\migrations\0001_initial.py
- Create model Job
让数据库的改动生效:
python manage.py migrate
再重新启动服务,无出错回到页面
这是的页面为:
增加职位
填写相关信息并保存,页面会显示如下:
设置默认值
使用default 设置默认值;
created_date = models.DateTimeField(verbose_name="创建日期",default=datetime.now) # default 设置默认值,引用datetime函数,所以now后面不需要加()
modified_date = models.DateTimeField(verbose_name="修改时间",default=datetime.now)
列表页展示字段
在admin.py中定制管理属性,注册job模型时,可以传入第二个参数
class JobAdmin(admin.ModelAdmin):
list_display = ('job_name','job_type','job_city','creator','created_date','modified_date') # 展示页展示相关信息
admin.site.register(Job,JobAdmin)
设置默认创建人,隐藏相关字段
使用exclude隐藏相关的字段;
class JobAdmin(admin.ModelAdmin):
list_display = ('job_name','job_type','job_city','creator','created_date','modified_date') # 展示页展示相关信息
exclude = ('creator','created_date','modified_date')
admin.site.register(Job,JobAdmin)
这样子创建人、创建时间、修改时间在修改页中就被隐藏了,系统会自动生成;
如果直接提交的话,系统内是没有这些属性的,所以我们可以利用JobAdmin中的ModelAdmin的一个save_model,这个方法可以在我们保存一个模型之前去做一些操作;
obj.creator = request.user
是将当前登录账号设置成创建人
class JobAdmin(admin.ModelAdmin):
exclude = ('creator','created_date','modified_date')
list_display = ('job_name','job_type','job_city','creator','created_date','modified_date') # 展示页展示相关信息
def save_model(self, request, obj, form, change):
obj.creator = request.user # 将创建人设置成当前用户
super().save_model(request,obj,form,change)
admin.site.register(Job,JobAdmin)