目录
Django是目前比较火爆的框架,之前有在知乎刷到,很多毕业生进入大厂实习后因为不会git和Django框架3天就被踢掉了,因为他们很难把自己的工作融入到整个组的工作中。因此,我尝试自学Django并整理出如下笔记。
在这部分,我将从最基本的网页的请求和响应做起,然后探索Django框架中的数据库操作(ORM),包括连接MySQL、数据库的增删改查操作、前端展示。最后利用所学完成一个学生系统的展示。
1. 请求和相应(request.method, request.GET, render, redirect)
我们在这里做几个尝试:
- 查看request的方法和类型
- 接受并输出URL传过来的信息
- 尝试redirect
views.py:
# *coding:utf-8*
from django.shortcuts import render, redirect
from django.http import HttpResponse
def AskAndAnswer(request):
# 1. 查看request的方法和类型
print(request.method)
# 2. 接受并输出URL传过来的信息
print(request.GET)
# 相应有好几种:
# 1.
# return HttpResponse("!")
# 2.
# return render(request, "AskAndAns.html")
# 3.重定向
return redirect(r"https://www.baidu.com")
我们输入此地址http://127.0.0.1:1129/AskAndAns/?n1=1,得到这个如下返回,并跳转到百度首页。
利用这部分的知识,我们已经可以完成一个用户登录界面的制作了。见案例1
2. 数据库操作(ORM框架)
2.1 ORM
我们知道python里面是有直接对数据库做增删改查的包(pymysql)的,我们当然可以把这个包用在Django中,但是我不打算这么做,因为Django里面内置了开发数据库用的ORM框架,更加方便。
ORM实际上就是一个“翻译”,将我们的在Django框架中的python指令转化为数据库的SQL语句,最后到数据库中执行这些语句。
ORM的主要功能:
- 创建、修改、删除数据库中的表(不能创建库)=> 不需要SQL语句
- 操作表中的数据(增删改查)=>不需要SQL语句
2.2 安装第三方模块(mysqlclient)
得安装一个东西在底层链接mySQL,我们这里选取mysqlclient。
pip install mysqlclient
2.3 创建数据库
因为我们没法通过ORM创建数据库,所以采取自己手动创建数据库的方式完成。没有MySQL数据库的可以搜索MySQL的安装和配置教程,类似的手把手教程网上一抓一大把。新手安装可能有坑,我尝试过超级详细的mysql安装和配置教程_933711的博客-CSDN博客_mysql安装教程,但是修改密码的时候跳不过初始的密码,尝试了很久之后发现还是这篇比较好用,直接删了重新装一遍:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)_huang6ing的博客-CSDN博客。当然这两篇博客仅供参考,毕竟每个人遇到的问题都不一样,而且我们的重点也不在这里。
在终端启动MySQL:
net start mysql
登录MySQL,并输入密码:
mysql -u root -p
创建名为test的数据库:
create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
查看是否创建:
show databases;
2.4 ORM链接数据库
在setting.py中 进行配置和修改。我们不用Django默认的数据库(sqlite3),我们用自己的。记得改数据库的名字、用户和密码。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '610129',
'HOSR': '127.0.0.1',
'POST': '3306',
}
}
2.5 ORM进行表操作(makemigrations, migrate)
操作分为增删改查,查没啥好说的,这里演示增删改:
2.5.1 创建表
我们先在model.py中加入如下代码,Django会将这个类中的指令转化为SQL语句。
from django.db import models
# Create your models here.
# 写一个继承models.Model的类
class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=64)
age = models.IntegerField()
写完配置,肯定是要执行的,在终端中输入命令。注意位置在文件的根目录。app也要注册到settings中。
python manage.py makemigrations
python manage.py migrate
命令执行前:
执行命令后:
只有第一个表是我们的表,其他的表都是Django为了执行一些默认的功能所创建的表,可以到setting中的ISTALLED_APPS中查看。我们在此关注第一个我们的表。
如果还想创建表,那就再写一个类,再执行一下makemigrations
和 migrate
语句。
class StudentInfo(models.Model):
name = models.CharField(max_length=32)
height = models.IntegerField()
2.5.2 删除表
这个也简单,直接把对应的类注释掉,然后再执行一下makemigrations
和 migrate
语句,那个表就没了。
2.5.3 修改表
修改表同上,直接再class里面修改,最后再执行一下makemigrations
和 migrate
语句,这里就不演示了。
注意:安全起见,Django在增加列的时候会设置选项,第一个选项为新列赋初值,第二个选项是取消增加列。以students类为例,我们增加两列:
class StudentInfo(models.Model):
name = models.CharField(max_length=32)
height = models.IntegerField()
weight = models.IntegerField(default=100)
age = models.IntegerField()
我们选择1,并将默认值设置为100:
当然我们也可以允许数据为空,就是参数设置的时候写null = True, blank = True
,这样就不会报1 2选项了。
2.6 ORM数据操作
### 2.6.1 加入数据(creat)
在views.py中建立页面:
def orm(request):
from application01.models import StudentInfo
StudentInfo.objects.create(name="Clark", height=182, weight=68, age=20)
StudentInfo.objects.create(name="Olsen", height=168, weight=50, age=33)
return HttpResponse("success!!")
运行成功:
2.6.2 删除数据(filter, delete)
view.py:
def orm(request):
from application01.models import StudentInfo
StudentInfo.objects.filter(name="Clark").delete()
# 全都删掉
# StudentInfo.objects.all().delete()
return HttpResponse("success!!")
删除成功:
2.6.3 筛选数据
无条件查看
view.py
def orm(request):
from application01.models import StudentInfo
data_list = StudentInfo.objects.all()
return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])
筛选查看
view.py
def orm(request):
from application01.models import StudentInfo
data_list = StudentInfo.objects.filter(name='Clark')
# 取第一个
data_list = StudentInfo.objects.filter(name='Clark').first()
return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])
2.6.4 更新数据(update)
view.py
def orm(request):
from application01.models import StudentInfo
StudentInfo.objects.filter(name="Clark").update(name = "ZLP")
data_list = StudentInfo.objects.all()
return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Isqd5W4z-1656576076671)(image-20220629145226034.png)]
3. 案例1(用户登录界面)
设计一个界面,可以输入用户名和密码,并且能把用户名和密码传回给我们。
view.py
# *coding:utf-8*
from django.shortcuts import render, redirect
from django.http import HttpResponse
# Create your views here.
def AskAndAnswer(request):
if request.method == "GET":
return render(request, "AskAndAns.html")
print(request.POST)
username = request.POST.get("user")
password = request.POST.get("pwd")
if username == "ClarkHu" and password == "I love Olsen":
return HttpResponse("登录成功!!")
return render(request, "AskAndAns.html", {"error_msg": "用户名或密码错误"})
AskAndAns.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录界面</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post" action="/AskAndAns/">
<!-- 为了解决Django自带的验证机制,如果没有这个,提交之后就会报forbidden-->
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit" value="提交">
<span style="color: red">{{ error_msg }}</span>
</form>
</body>
</html>
效果如下:
返回值如下,第一个参数就是Django自带的校验参数,如果没有它,Django会认为这个请求时非法请求,不就会给一个forbidden:
4. 案例2(学生管理界面)
这实际上就是对增删改查操作的应用,我们根据功能一步一步实现:
- 展示用户列表
views.py
def student(request):
from application01.models import StudentInfo
data_list = StudentInfo.objects.all()
return render(request, "students.html", {"data_list": data_list})
students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Students</title>
</head>
<body>
<h1>
学生表:
</h1>
<a href="/ORM/Students_add">
<button>添加</button>
</a>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>身高</th>
<th>体重</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
{% for obj in data_list %}
<tr>
<!-- 这段循环我也不知道为什么没有运行起来-->
<!-- {% for k, v in obj.items %}-->
<!-- <td>{{ v }}</td>-->
<!-- {% endfor %}-->
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.height }}</td>
<td>{{ obj.weight }}</td>
<td>{{ obj.age }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
效果如下:
- 添加用户
views.py:
ef student_add(request):
from application01.models import StudentInfo
if request.method == "GET":
return render(request, "stu_add.html")
else:
# 获取数据
name = request.POST.get("name")
height = request.POST.get("height")
weight = request.POST.get("weight")
age = request.POST.get("age")
# 连通数据库
StudentInfo.objects.create(name=name, height=height, weight=weight, age=age)
# 跳转回去
return redirect("/ORM/Students")
stu_add.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/ORM/Students_add">
{% csrf_token %}
<input type="text" name="name" placeholder="姓名">
<input type="text" name="height" placeholder="身高">
<input type="text" name="weight" placeholder="体重">
<input type="text" name="age" placeholder="年龄">
<input type="submit" value="提交">
</form>
</body>
</html>
- 删除用户
views.py:
def student_del(request):
from application01.models import StudentInfo
nid = request.GET.get("nid")
StudentInfo.objects.filter(id=nid).delete()
return redirect("/ORM/Students")
修改students.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Students</title>
</head>
<body>
<h1>
学生表:
</h1>
<a href="/ORM/Students_add">
<button>添加</button>
</a>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>身高</th>
<th>体重</th>
<th>年龄</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in data_list %}
<tr>
<!-- 这段循环我也不知道为什么没有运行起来-->
<!-- {% for k, v in obj.items %}-->
<!-- <td>{{ v }}</td>-->
<!-- {% endfor %}-->
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.height }}</td>
<td>{{ obj.weight }}</td>
<td>{{ obj.age }}</td>
<td><a href="/ORM/Students_del?nid={{obj.id}}"><button>删除</button></a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
系统效果如下: