1. 下载Django
1.1 命令行
pip3 install django==1.11.15
1.2. pycharm安装
2. 创建项目
2.1 命令行
django-admin startproject 项目名
2.2 pycharm
3. 启动项目
3.1 命令行
cd 项目目录下
python manage.py runserver # 127.0.0.1:8000
python manage.py runserver 80 # 127.0.0.1:80
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80
3.2 pycharm
4. APP管理
4.1 创建APP
4.1.1 python manage.py startapp APP名字
4.1.2 创建后对象各个文件解释:
a. admin Django自带后台管理相关配置
b. models 写类,根据类创建数据库表
c. tests 单元测试
views 业务处理
4.2 注册APP
4.2.1 在settings.py
INSTALLED_APPS = [ 'app01', 'app02.apps.App02Config' ]
5. 路由系统(URL和函数的对应关系)
5.1 ur格式
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'index/',views.index) # 普通匹配 url(r'edit/(\w+)',views.edit) # 正则匹配 ]
5.2 路由分发
如果一个项目中有多个app,就需要用到路由分发
5.2.1 将项目同名目录下的urls文件导入模块
from django.conf.urls import url,include 修改为:
url(r'^app01/', include('app01.urls'))
5.2.2 先将项目同名目录下的urls文件分别拷贝到多个app下面
修改为: url(r'^index.html$', views.index),
5.2.3 可以选择删除多余部分
5.3 反向生成url
指定url别名,获取到url
url(r'index/',views.index,name='n1') # 指定一个名字,这个名字就代表了这个url
通过reverse反生成url
url(r'^index/(\d+)/', views.index,name='n1'), # index后面只有一个值的时候,views中的函数就要多传一个值,而且reverse里用args,如果是(?P<变量名>\d+)这样的话,args就要换成kwargs,并且用字典的形式表示值,比如:{'a1':1111} def index(request,a1): # urls里面定义了几个参数就传几个参数 name = reverse('n1',args=(111,)) # args=()表示要生成的url,并改名 name = reverse('n1',kwargs={'a1':1111}) # kwargs={}表示要生成的url,并把反向生成的url改名成了a1对应的值 print(name)
从上往下进行匹配
第一个参数是正则
6. 视图函数
6.1 request 封装了请求所有的东西
request.path_info ——》URL路径
request.method ——》请求方式
request.POST ——》POST提交的数据 { }
request.GET ——》URL上的参数 /login/?username=alex&passwor=123
6.2 响应
新手必备三件套
1. HttpResponse('home') —— 返回一个字符串
2. render(request,'index.html') —— 返回一个具体的页面
3. redirect(跳转的URL) ——重定向 响应头 location:'跳转的地址'
6.3 函数的写法
def index(request): # 普通写法,可以传多个值,但最少有一个值 函数体 return 三件套之一
def index(request,args): # 如果涉及到正则的话,可以传多个值
函数体
return 三件套之一
7. 静态文件的配置
STATIC_URL = '/static/' # 别名 /static999/ STATICFILES_DIRS= [ os.path.join(BASE_DIR,'static') ]
8. ORM
8.1 pymysql连接数据库
a.import pymysql
b.创建一个连接
c.创建一个光标
d.执行SQL语句
e.得到sql的结果
f.关闭光标
g.关闭连接
8.2 ORM
8.2.1 优点
不用写SQL
8.2.3 缺点
1. 只能完成一部分操作
2. 效率低
8.2.4 是什么?
对应关系
类 表
对象 记录
属性 字段
8.2.5 ORM的功能:
1. 操作数据表
2. 操作数据行
8.2.6 使用ORM
1. 创建一个数据库
2. 配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's22day18', 'USER': 'root', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': 3306, } }
3. 在项目同名的文件夹下的__init__.py中写代码:
import pymysql pymysql.install_as_MySQLdb()
4. 在app下的models.py中写类:
class Publisher(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=16)
5. 执行数据库迁移的命令
python manage.py makemigrations # 保存APP下的models.py的变更记录 pyhton manage.py migrate # 将变更记录同步到数据库中
9. ORM操作
表的操作:
创建一个员工表:
class Publisher(models.Model): nid = models.AutoField(primary_key=True) user = models.CharField(max_length=32) password = models.CharField(max_length=128)
9.1 修改表字段名
1、name = models.CharField(max_length=32) 将name该为user,直接在现在类里面把name改为user 2、执行命令 python manage.py makemigrations Did you rename publisher.name to publisher.user (a CharField)? [y/N] 输入y python manage.py migrate
9.2 增加表字段
1、类中增加一行age = models.IntegerField(null=True) null=True表示字段可以为空,还可以设置为default=10,表示默认插入值是10 2、执行命令 python manage.py makemigrations python manage.py migrate
9.3 外键操作
先创建一个和员工表关联的表,
class Home(models.Model): dep_id = models.CharField(max_length=56)
然后
1、在员工表中插入一条: home_id = models.ForeignKey('Home',null=True) Home表示要关联的表,并可以为空 2、执行命令
python manage.py makemigrations python manage.py migrate
9.4 表内数据的操作:
9.4.1 查询
获取所有数据
models.Publisher.objects.all() —— 》 queryset 对象列表
获取满足条件的所有数据数据
models.Publisher.objects.filter(name='xxx') —— 》 queryset 对象列表
排序
models.Publisher.objects.all().order_by('id') —— 》 queryset 对象列表 升序 models.Publisher.objects.all().order_by('-id') —— 》 queryset 对象列表 降序
获取一个对象
models.Publisher.objects.get(nid=1) # 获取不到或者获取多个就报错
9.4.2 增加
models.Publisher.objects.create(name='xxxxx') —— 》成功插入的对象
9.4.3 删除
models.Publisher.objects.filter(nid=nid).delete() ——》 删除满足条件的所有对象 models.Publisher.objects.get(nid=nid).delete() ——》 删除对应的对象
9.4.4 修改
pub_obj = models.Publisher.objects.get(nid=nid) pub_obj.name = 'xxxx' pub_obj.save() # 写入数据库
10. 模板语法
{{ 变量 }}
{{ pub_obj.name }}
{{ pub_obj.id }}
{% for i in pub_list %}
{{ forloop.counter }} # 当前循环的次数
<tr>{{ i }}</tr>
{% endfor %}