1.安装django
pip install django
2.创建项目
Django中项目会有一些默认的文件和默认的文件夹。
2.1在终端
(1)打开终端
(2)进入某个目录(项目放在哪里)
/software/A-Python/python_code
1.默认项目的文件介绍:![](https://i-blog.csdnimg.cn/direct/dc017b6880de4733b708bf9481486dd2.png)
(1)manage.py:用于对项目的管理,以及启动项目,创建app,做数据库的管理等等都是基于这个文件,我们常常使用但是我们一行代码都不用修改。
(2)wsgi.py和asgi.py:这两个文件都是网站用于接收网络请求的,前者是同步式的,后者为异步式的,我们也不用管,不需要修改。
(3)urls.py:用于写所有的URL和函数的对应关系,这是常常操作的文件(每写一个页面加上一个请求都要来这里写)。
(4)settings.py:用于写各种配置文件,比如链接数据库,它的用户名,密码这些都是写在这个文件中。以后用到那种配置,我们就需要在其中进行修改和添加配置。
2.APP (各自APP之间的的表结构,函数,HTML模版,CSS都可以是相互独立的,不相互影响,目的是为了共同完成一个项目)
3.创建app的方法:
在终端上输入:
python manage.py startapp app01
即可创建app01。
4.创建新app01后的各文件功能:
(1)views.py:主要是用于写URL对应的执行的函数(也就是urls.py所需对应的执行函数)
(2)models.py:专门用于我们对数据库进行操作(Django有自己专门的数据库orm,不需要使用mysql)。
(3)其余app的各类文件我们不需要去修改,不用管。
注意:APP在创建完成之后,我们还需要对其进行注册才能使用(setting.py中编写):
5.编写一个页面
(1)编写URL和视图函数之间的关系(在urls.py中编写):
(2)编写视图函数(在views.py中编写,该函数默认附带request)
6.templates模版
7.引用静态文件(static)(可以用于我们引用css,js,图片等需求)
在开发过程中一般将:
- 图片
- css
- js
都会当做静态文件进行处理。故静态文件我们都放在static文件中。
(1)在app目录下创建static文件夹
(2)引用静态文件,Django中是不推荐使用绝对路径来引入我们需要的静态文件的,比如:
这种绝对路径我们以后需要修改项目名时会比较麻烦(因为写死了),我们更加推荐通过使用load static的方式来引入我们需要的静态文件:
8.模版语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模版语法学习</h1>
<div>{{n1}}</div>
<div>{{n2}}</div>
<!--列表 roles-->
<div>{{n2.0}}</div>
<div>{{n2.1}}</div>
<div>{{n2.2}}</div>
<div>
{% for item in n2 %}
<span>{{ item }}</span>
{% endfor %}
</div>
<!--字典 user_info -->
{{n3}}
{{n3.name}}
{{n3.salary}}
{{n3.role}}
<ul>
{# {% for item in n3.keys %} <!--取user_info的键-->#}
{# {% for item in n3.values %} <!--取user_info的值-->#}
{% for item in n3.items %} <!--取user_info的键和值-->
<li>{{ item }}</li>
{% endfor %}
</ul>
<!--列表里套字典 data_list-->
<hr>
{{n4.0}}
{{n4.1.name}}
{{n4.1.role}}
{% for item in n4 %}
<div>{{item.name}} {{item.salary}}div></div>
{% endfor %}
<hr/>
<!--if语句-->
{% if n1 == "杨晨" %}
<h1>你要快乐</h1>
{% else %}
<h1>你要健康</h1>
{% endif %}
</body>
</html>
本质上:在HTML中写一些占位符(如:{{xxx}}),由数据对这些占位符进行替换和处理。
处理流程如下:
注:浏览器拿到的永远是完完全全被替换完成的字符串。
9.案例:伪联通新闻中心
(1)
(2)
(3)
10.请求和响应
11.登录
(1)urls.py:
(2)login.html:
(3)views.py:
当我们浏览器中输入/login/时,我们会先执行urls.py中的
path('login/',views.login)
然后找到views.py中的login(request)函数并执行。首先是因为一开始输入值是GET类型,所以我们会执行
return render(request,"login.html")
因此我们会进入login.html中,也就是显示我们的登录界面,然后输入用户名和密码后我们点击提交此时是POST类型,此时我们会执行login(request)函数来获取用户提交的数据,此时又会区分为登录成功和登录失败。登录成功则会进入新的页面,登录失败则是会输出"用户名和密码错误"。
12.数据库操作
(1)MySQL数据库 + pymsql
import pymysql
# 1.连接MySQL
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="201967yc", charset="utf8", db="unicom") # 此处的user="root", passwd="201967yc"是你一开始设定好的,db="unicom"是你要创建的数据库。
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 基于cursor去发送指令。
# 2.发送指令
cursor.execute("insert into admin(username,password,mobile) values('杨晨','201967yc','13476068651')") # 由于两边是双引号了内部想表达字符串则要用单引号。
conn.commit() # 提交命令
# 3.关闭
cursor.close()
conn.close()
(2)Django开发操作数据库更简单,内部提供了ORM框架。(ORM本质是一个翻译SQL语句的过程,不需要开发者自己编写SQL语句)
ORM本身不能用于连接数据库,但它可以通过pymysql,mysqldb,mysqliclient这些作为底层去操作数据库,传统的MySQL操作数据库是通过sql语言去实现,而ORM则是对这些底层语言进行翻译,它会自动翻译成SQL语句,从而去数据库中执行,执行完之后再把结果拿回来返回给代码。
(2)安装第三方模块(django最新的版本pymysql支持的不太好,我们选择安装mysqlclient)
pip install mysqlclient
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pymysqlclient
(3)ORM
ORM可以帮助我们做两件事:
<1>创建,修改,删除数据库中的表(不用你写SQL语句)。[但是ORM无法自动创建数据库,也需要你自己创建]
<2>操作表中的数据(不用写SQL语句)。
insert into update select......
1.自己创建数据库
create database 数据库名字; # 但是不建议直接这样写,因为一些编码的问题可能导致出现错误
create database 数据量名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # 建议用这个方法创建数据库,设置了数据库的默认字符集为utf8。(utf8支持中文)
创建叫xiaomi的数据库:
create database xiaomi DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
xiaomi数据库创建成功:
2.Django连接数据库(django的厉害之处在于可以连接mysql还可以连接sqlite3,postgresql,oracle等一系列数据库)。
在setting.py文件中进行配置和修改。
Django中默认用的是sqlite3这个文件数据库,我们不需要用到它我们将其注释掉:
我们连接自己的MySQL数据库:
3.Django操作表
(1)创建表
(2)删除表
(3)修改表
(1)创建表:在models.py文件中写入一个类:
此处的类型就相当于我们数据库中的表名,name,password,age这些字段名就相当于我们数据库中的列名。
此时ORM底层会通过我们上面写的代码自动给我们创建一个表,表名叫它的app名称+_userinfo:
# ORM底层根据我们的代码创建的表
'''
create table app01_userinfo(
id bigint auto_increment primary key, # 此处id是django自动生成的。
name varchar(32),
password varchar(64),
age int
)
'''
执行命令:(在终端中直接输入即可)
【注意】:执行命令前:在与 settings.py 同级目录下的__init__.py 中引入模块和进行配置__init__.py说明:__init__.py 是一个空文件,它在Python中起着非常重要的作用,主要用于标识一个目录为Python包。在Django项目中,它通常被用于标记与 settings.py 同级别的目录为一个包。这实际上是一种代码组织方式,可以帮助我们把相关的设置和文件组织在一起。此外,当其他模块需要导入 settings.py 中的变量和配置时,这个标记也是非常有用的。
_init_.py:
import pymysql
pymysql.install_as_MySQLdb()
如下(重要):
python终端输入(每次在app的models.py中执行写入一个表都要在终端中输入下面执行指令一遍):
python manage.py makemigrations
python manage.py migrate
python终端运行结果:
(注意:在执行前要确保(1)已经安装了mysqlclient(2)已经注册了app。)
去cmd终端查看创建表成功:
对于django框架中自带的app,我们可以选择不管,也可以注释掉。
(2)删除表:
<1>删除已经创建的表:
如果想删掉已经创建好的表,我们只需要在app的models.py中对齐进行注释,然后执行我们的命令:
python manage.py makemigrations
python manage.py migrate
这样就可以将我们之前创建的表删除掉。
<2>删除已经创建的字段:
直接对要删除的字段进行注释
再执行指令:
python manage.py makemigrations
python manage.py migrate
(3)修改表:
已经创建的表里添加字段:
写入后执行指令会出现两个选项第一个选项是在终端中直接给size赋值,第二个选项是我们在新增的字段函数里设置一个默认值:
size = models.IntegerField(default=2)
python终端运行如下图所示:
【小结】:以后在开发中如果想要对表结构进行调整(创建表,删除表,修改表)(彻底告别sql语句):
(1)在models.py文件中操作类即可。
(2)执行命令
python manage.py makemigrations
python manage.py migrate
14.操作数据库表中的数据
(1)models.py:
(2)views.py:
<1>新增表数据
<2>删除表数据
<3>获取表数据
<4>更新表数据
15.案例:用户管理(对user_info这张表进行管理)
15.1.展示用户列表
(1)urls.py
(2)函数
<1>获取所有用户信息
<2>HTML渲染
(1)urls.py
(2)views.py
(3)info_list.html
(4)程序运行流程:
首先在浏览器中输入info/list/,则程序会跳转至views.py中的info_list(request)函数中,此时info_list()函数执行UserInfo.objects.all()函数用于获取UserInfo表格中所有数据存储在给data_list列表中,然后执行函数:
return render(request, "info_list.html", {"data_list":data_list})
函数的三个参数分别是request,模版名称(info_list.html)和字典(它包含了要传递给模版的数据)。在info_list.html中通过循环从data_list取出从数据库中获得的所有的数据并展现在页面中。
(5)运行结果:
15.2添加用户
(1)urls.py
(2)函数
<1>以GET请求看到页面,输入内容。
<2>以POST请求提交->写入到数据库。
(1)urls.py
(2)views.py
(3)info_add.html
(4)程序运行流程:
首先在浏览器中输入info/add/,则程序会跳转至views.py中的info_add(request)函数中,此时info_add()函数判断是否为GET请求(一开始在浏览器中输入info/add/一定就是GET请求,所以必然成立)接下来执行
return render(request,'info_add.html')
此函数用于将数据渲染到模板并生成HTML页面。这里有两个参数:request和模版名称(info_add.html),request包含了地方当前HTTP请求的所有信息,而模版名称则指定了要使用的HTML模版文件。最后这个函数返回一个包含渲染后HTML内容的HttpResponse对象。接着我们进入info_add.html,它创建了一个表单,表单中包含了"user","pwd","age",并且我们提交表单时是以POST请求方式进行提交。接着提交完成后,回到info_add(request)函数中执行获取用户数据的程序,并且将获取到的数据"user","pwd","age"添加到数据库中,添加完成后使其自动跳转到数据库页面进行展示。
(5)运行结果:
15.3删除用户
(1)urls.py
(2)函数
实现思路(伪代码):
http://127.0.0.1:8000/info/delete/?nid=1
http://127.0.0.1:8000/info/delete/?nid=2
http://127.0.0.1:8000/info/delete/?nid=3
def 函数(request):
request.GET.get("nid") # 获取我们在搜索框中输入的GET请求的nid的值。
UserInfo.objects.filter(id=nid).delete()
代码实现:
(1)urls.py
(2)views.py
(3)info_list.html
(4)运行结果: