Django
1.安装Django
pip install django
python的包的分布
\python- python.exe- Scripts- pip.exe- django-admin.exe  [工具,创建django项目]- Lib- 内置模块- site-packages 		[安装的包]- pymysql- flask- django 					[框架的源码]
2.创建项目
Django项目会有一些默认的文件和默认文件夹
2.1 终端
-  进入终端 
-  进入某个目录(Django项目存放位置) >>> D: >>> cd/PycharmProjects >>> dir >>> cd ..
-  执行命令创建项目 “D:\python\Scripts\django-admin.exe” startproject 项目名称 #已加入环境变量 django-admin startproject 项目名称
2.2 Pycharm
直接创建Django项目就好
#settings.py里面的
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [BASE_DIR / 'templates']#相较于终端建立,多了这句,会优先在根目录的templates找模板,然后再去app目录下的templates找,'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
默认项目的文件介绍
├─manage.py 		[项目的管理,启动项目、创建app、数据管理,不用修改]
│
├─mysite
│      __init__.py
│      settings.py		【项目配置文件】
│      urls.py				【URL和函数的对应关系】【需要写】
│      asgi.py				【接收网络请求】【不要动】
│      wsgi.py				【接收网络请求】【不要动】
│
└─templates
3. APP
- 项目- app,用户管理	【表结构、函数、HTML、CSS模板】- app,订单管理	【表结构、函数、HTML、CSS模板】- app,后台管理	【表结构、函数、HTML、CSS模板】- app,网站		 【表结构、函数、HTML、CSS模板】- app,API			 【表结构、函数、HTML、CSS模板】..
python终端中创建app:
python manage.py startapp  APP名称
├─app01
│  │  admin.py					【固定,不用动】 dajango默认提供了admin后台管理
│  │  apps.py						【固定,不用动】app启动类
│  │  models.py					【**重要**】,对数据库操作
│  │  tests.py					【固定,不用动】单元测试
│  │  views.py					【**重要**】视图函数
│  │  __init__.py
│  │
│  └─migrations					【固定,不用动】数据库迁移记录
│          __init__.py4.启动Django
-  确保app已注册 INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config' #setting中注册app,在创建的app的apps.py中找到name和Config ]
-  编写URL和视图函数对应关系 (urls.py) from django.contrib import admin from django.urls import pathfrom app01 import views urlpatterns = [#path('admin/', admin.site.urls),#www.xxx.com/index/ --> 执行函数path('index/', views.index), #在app01的views.py中找index函数 ]
-  编写视图函数(view.py) from django.shortcuts import render,HttpResponse# Create your views here.def index(request): #必须带一个request参数return HttpResponse("Hello, world. You're at the index")
-  启动Django项目 -  命令行启动 python manage.py runserver
-  Pycharm 启动Django项目即可,注意默认的端口是8000,而酷狗音乐喜欢占用8000,需要关闭 
 
-  
4.1 templates模板
def user_list(request):#去app目录下的templates目录寻找哦user_list.html (根据app的注册顺序,逐一去它们的 templates找),render是重定向的意思,定向到这个网页return render(request, "user_list.html")
4.2 静态文件
开发过程中一般将:
- 图片
- CSS
- js
都会当作静态文件处理,需要放在对应app目录下的static文件夹内
static- css- js- img- plugins
引用static文件:
{% load static %}
<!--传入static的路径--><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}"
</head>
<body><h1>用户列表</h1><script src="{% static 'js/jquery-3.7.1.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
</body>
</html>
5.Django模板的语法
def tpl(request):name = "Zeus"roles=["top","jungle","mid","ad","sup"]player_info={"name":"Jackeylove","role":"ad","age":"25"}data_list=[{"name": "Jackeylove", "role": "ad", "age": "25"},{"name": "369", "role": "top", "age": "25"},{"name": "Meiko", "role": "sup", "age": "25"}]return render(request, 'tpl.html', {"n1":name,"n2":roles,"n3":player_info,"n4":data_list})<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>Django模板语法学习</h1><div>{{ n1 }}</div><div>{{ n2 }}</div><!--获取单个元素,可以是列表--><div>{{ n2.0 }}</div><div>{{ n2.1 }}</div><div>{{ n2.2 }}</div><!--获取列表中的单个元素,使用.-->
<div><!--for 循环-->{% for item in n2 %}<span>{{ item }}</span>{% endfor %}
</div>
<hr/>
<!--字典元素-->
{{ n3 }}
{{ n3.name }} <!--根据key获得单个value-->
{{ n3.salary }}
{{ n3.role }}<ul>{%  for item in n3.keys %}<!--for循环获取键--><li>{{ item }}</li>{% endfor %}{%  for item in n3.values %}<!--for循环获取值--><li>{{ item }}</li>{% endfor %}{%  for item in n3.items %}<!--for循环获取键值--><li>{{ item }}</li>{% endfor %}</ul>
<!--列表里面嵌套字典(通过.来获取)-->
{{ n4.1.name }}
{{ n4.1.role }}{% for item in n4 %}<div>{{ item.name }} {{ item.roles }}</div>
{% endfor %}
<hr/>
<!--条件语句-->
{% if n1 == "Zeus" %}<h1>世一上</h1>
{% elif n1 == "The Shy" %}<h1>断手</h1>
{% else %}<h1>?</h1>
{% endif %}
</body>
</html>
总结
-  获取单个值(可以是列表,可以是字典): {{ [传入名称] }}
-  获取列表中的单个值 {{ [传入名称].i}}
-  字典元素 对于单个字典元素,有key,value,item三个属性,对于字典,有keys,values,items三个属性 
-  for循环 {% for item in [遍历的列表或字典] %}<!--html样式,在这里会重复列表或字典的长度次数--> {% endfor%}
-  条件语句 {% if (p)%}<!--html样式--> {% elif (p1) %}<!--html样式--> ... {% else %}<!--html样式--> {% endfor %}
6.请求和响应
def something(request):#request是一个对象,封装了用户通过浏览器发送过来的所有数据#1.获取请求方式print(request.method)#2.在URL上传递的值,用GET可以得到print(request.GET)#3.在请求体中提交的数据print(request.POST)#响应#4.HttpResponse("返回内容"),内容字符串内容返回给请求者#return HttpResponse("返回内容")#5.读取html的内容,加上渲染,生成新的字符串,返回给用户浏览器#return render(request,'something.html',{"title":"来了"})#6.重定向到其他页面return redirect("http://www.bilibili.com")
 redirec方法是Django收到重定向后,将网址返回给请求者,由请求者自己转移到对应网址。
案例 用户登录
在以POST方式返回用户名和密码时,遇到这种情况:

此时需要在用户登录的form表单中,加入{% csrf_token %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登陆</title><link rel="stylesheet" href="../static/css/log_in_green.css"/>
</head>
<body>
<h1>用户登录</h1>
<form method="post" action="/login/">{% csrf_token %}<input type="text" name ="user" placeholder="用户名"/><input type="password" name="user" placeholder="密码"/><input type="submit" value="提交"/></form>
</body>
</html>
7.Django连接数据库
1.创建数据库
- 启动数据库
- 自带工具创建数据库
create database library DEFAULT CHARSET utf8 COLLATE utf8_general_ci
2.django连接数据库
 在settings.py文件中进行配置和修改
在setteings对DATABASES进行更改:
DATABASES={'default':{'ENGINE':'django.db.backends.mysql',#表示可连接mysql,可将mysql改为sqlite3,'NAME':'library',#写想连接的数据库的名字'USER':'root',#用户名'PASSWORD':horse030811,#密码'HOST':'127.0.0.1',#MySQL是哪台机器'PORT':3306,#端口}
}
3.django操作表
- 创建表
- 删除表
- 修改表
在models.py文件中,通过定义类来完成表的创建:
class StudentInfo(models.Model):#必须继承models.Model的内容user_id = models.CharField(max_length=20)#登录用的idname =models.CharField(max_length=32)#名字password = models.CharField(max_length=64) #登录密码age = models.IntegerField()#年龄gender = models.IntegerField()#性别,男是0,女是1,或者更多,但应该不多于2^32major = models.CharField(max_length = 20)#专业email = models.CharField(max_length=32)#邮箱,找回密码时可用grade = models.CharField(max_length=10) #年级#上述代码将由orm翻译为对应sql语句create table app01_studentinfo(#表的名称是 app名称+ _ + calss类的小写id bigint auto_increment primary key #orm创建的每个表都会自动创建一个递增的主键idname varchar(32),password varchar(64),age int...
)models的类型
-  AutoField 一个自增的IntegerField,想要自定义主键,那么需要填上primary_key,一般不用,django会自动地为每一张表添加自增主键。 uid = models.AutoField(primary_key = True)
-  CharField 用来存储字符串(必须指定长度,且小于254个字符) name = models.CharField(max_length=20,default='xxx') #max_length必须指定
-  DateField 保存日期,记录年月日,在数据库中也是date类型,有如下几个参数: auto_now =True:每次保存对象时,自动设置该字段为当前时间(可用于修改字段) auto_now_add = True:对象第一次被创建时自动设置当前地时间,自动保存的时间的时区使用的时默认时区(可用于创建字段) test_edit_time = models.DateField(auto_now = True) test_create_time = models.DateField(auto_now_add=True)
-  DateTimeField 相较于DateField,这个更常用,可保存日期和时间,也有类似的参数 test_edit_time = models.DateTimeField(auto_now = True) test_create_time = models.DateTimeField(auto_now_add=True)
-  TextField 用于存储大字符串(大于254个字符),是数据库中的longtext类型 
-  IntegerField 整型,32位bits,还有BigIntegerField,从 − 2 63 到 2 63 − 1 -2^{63}到2^{63}-1 −263到263−1。 
-  BinaryField 存储二进制的字段,只支持bytes赋值 
-  BooleanField 存储True或False,在数据库中是tinyint类型,若没指定默认值,则位None。如果可能为null,则需要将类型设置为NullBooleanField 
-  FloatField 浮点数,即float 
-  UUIDField 用来存储UUID的字段,使用的是python的UUID类 
写好model后,表还没被创建,还需要在终端执行命令(app需要提前注册):
python manage.py makemigrations
python manage.py migrate#需要mysqlclient包
就可以生成表了,表时INSTALLED_APPS(settings.py)中注册的app(包含默认的表)
修改表
一个已经生成的表,如果在models里面删去了某个值,那么再makemigrations和migrate后,表中对应的列将会消失。
 如果在models中增加了一个值(即增加了一列),就产生了一个问题,表中原有的元组中的新属性的值是什么?此时映射后,终端会提示你做出选择:
- Provide a ont-off default now(will be set on all existing rows with a null value for this column)
- Quit,and let me add a default in models.py
输入1和2进行选择
输入1,则需要输入一个希望的默认值。
输入2,则直接退出,提示在models里设定好默认值(default=xx)