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__.py
4.启动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)