小白的django学习笔记 2024/5/7 8:30
单表数据库添加,查询,删除,修改
添加
把表单form中的input信息,发送给视图函数,视图函数再传递给mysql
发送给视图函数
视图函数
from django.shortcuts import render
# request表示浏览器向django请求网页,佩戴的浏览器信息:比如,浏览器向django要显示add_stu.html
def showStu(request):
return render(request, "add_stu.html")
def addStu(request):
name=request.POST.get("sname")
sex=request.POST.get("ssex")
print(name,sex)
return render(request,"add_stu.html")
配置地址,别忘了导包
html文件改一下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--form是用来吧input标记的内容进行收集、打包,发给后台Python-->
<form action="/addStu/" method="post">
{% csrf_token %}
学生姓名<input type="text" name="sname"><!--name 表示给输入框起个名,type表示输入框的类型,input表示输入标签-->
学生性别 <input type="text" name="ssex">
<!--学生 爱好 唱<input type="checkbox" name="sname">跳<input type="checkbox" name="sname">rap<input type="checkbox" name="sname">篮球<input type="checkbox" name="sname">-->
<input type="submit">
</form>
</body>
</html>
运行、输入、成功
发送给mysql
通过模型,把值发给mysql
- 模型就是mysql表(或者说模型是ORM(object对象-relation关系-mapping映射)映射,把Python的类与mysql对应起来)
- 创建模型
- 在视图函数中,把要存的值存到模型中
- pip insatll pymysql 安装mysql支持
- 在settings.py中加入自己创建的模块
- 根据模型手动生成sql脚本 python manage.py makemigrations
- 根据生成的脚本,在MySQL中创建表 python manage.py migrate
- 注:上面的views.py位置错了,后面改动到了stu下(不是stu下的migrations下)
写模型
需要手动生成sql脚本
写视图函数
配置数据库位置
在setting.py替换这一块
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库用户密码
'NAME': 'jtxy', # 数据库名字
}
}
装mysql
打开Anaconda Prompt,输入
pip install pymysql
导入mysql模块
在这个项目模块下的__init__.py文件中加入这两行
from pymysql import install_as_MySQLdb
install_as_MySQLdb() # 让pymysql以 MySQLDB的运行模式和django的ORM对接运行
在settings.py中加入自己创建的模块
执行
创建脚本
python manage.py makemigrations
根据生成的脚本,在mysql中创建表
python manage.py migrate
测试是否成功
- 跑起来
- 进入网页
- 提交数据
- 查看MySQL是否已存在数据
错误:
1.pip insatll pymysql执行错位置,跑到cmd里面执行去了,应该在Anaconda Prompt里面
2.views.py、models.py都写到migrations包下面去了,导致一直找不到,应该在当前的项目模块下
3.找错了_ini_.py文件,应该是stu下
- 创建主页
<table>表示表
<tr>行
<td>列
<iframe>是一个显示网页的容器,src网页地址,name是容器名称
<a>是超链接
在计算机中,每一行的列数要相同
默认django默认不支持<iframe>,需要添加支持
需要再setting里面加入这句话
X_FRAME_OPTIONS = ‘SAMEORIGIN’
记得把这俩删了
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="100%" height="100%">
<tr height="15%">
<td colspan="2">top</td>
</tr>
<tr>
<td width="20%">
<!--target="main"是容器名,指的把网页显示到容器中-->
<a href="/showStu/" target="main">增加</a><br>
<a href="/findStu/" target="main">查询</a>
</td>
<!--iframe 是一个显示网页的容器,src网页地址 name容器名称-->
<td><iframe src="/showStu" width="100%" name="main" height="100%"></iframe> </td>
</tr>
</table>
</body>
查询
- 网页通过调用视图函数,视图函数调用模型获取数据,
index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="100%" height="100%">
<tr height="15%">
<td colspan="2">top</td>
</tr>
<tr>
<td width="20%">
<!--target="main"是容器名,指的把网页显示到容器中-->
<a href="/showStu/" target="main">增加</a><br>
<a href="/findStu/" target="main">查询</a>
</td>
<!--iframe 是一个显示网页的容器,src网页地址 name容器名称-->
<td><iframe src="/showStu" width="100%" name="main" height="100%"></iframe> </td>
</tr>
</table>
</body>
views.py
from django.shortcuts import render
# request表示浏览器向django请求网页,佩戴的浏览器信息:比如,浏览器向django要显示add_stu.html
from stu.models import Student
def showStu(request):
return render(request, "add_stu.html")
def addStu(request):
name=request.POST.get("sname")
sex=request.POST.get("ssex")
stu=Student.objects.create(sname=name,ssex=sex)
#或者stu=Student(sname=name,ssex=sex)
stu.save()
return render(request,"add_stu.html")
def showIndex(reuqest):
return render(reuqest,"index.html")
def findStu(request):
#从表中获取数据
students=Student.objects.all()
#表示把数据带到网页上
return render(request,"show_stu.html",{"students":students})
urls.py
from django.contrib import admin
from django.urls import path
from stu.views import showStu, addStu,findStu,showIndex
urlpatterns = [
path('admin/', admin.site.urls),
path('showStu/', showStu),
path('addStu/', addStu),
path('showIndex/', showIndex),
path('findStu/',findStu)
]
show_stu.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="100%">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生性别</td>
</tr>
{% for stu in students %}
<tr>
<td>{{ stu.sid }}</td>
<td>{{ stu.sname }}</td>
<td>{{ stu.ssex }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
查看
删除
- 传值给视图函数
- 视图函数根据id删除对应数据,并再查询一边,把结果发到网页
- 网页读取显示
view.py
from django.shortcuts import render
# request表示浏览器向django请求网页,佩戴的浏览器信息:比如,浏览器向django要显示add_stu.html
from stu.models import Student
def showStu(request):
return render(request, "add_stu.html")
def addStu(request):
name=request.POST.get("sname")
sex=request.POST.get("ssex")
stu=Student.objects.create(sname=name,ssex=sex)
#或者stu=Student(sname=name,ssex=sex)
stu.save()
return render(request,"add_stu.html")
def showIndex(reuqest):
return render(reuqest,"index.html")
def findStu(request):
#从表中获取数据
students=Student.objects.all()
#表示把数据带到网页上
return render(request,"show_stu.html",{"students":students})
def deleteStuById(request):
id=request.GET.get("id")
Student.objects.filter(sid=id).delete()
#再查询一遍
students=Student.objects.all()
return render(request, "show_stu.html", {"students": students})
urls.py
"""untitled URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from stu.views import showStu, addStu, findStu, showIndex, deleteStuById
urlpatterns = [
path('admin/', admin.site.urls),
path('showStu/', showStu),
path('addStu/', addStu),
path('showIndex/', showIndex),
path('findStu/',findStu),
path('deleteStuById/',deleteStuById),
]
show_stu.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="100%">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生性别</td>
<td>删除</td>
</tr>
{% for stu in students %}
<tr>
<td>{{ stu.sid }}</td>
<td>{{ stu.sname }}</td>
<td>{{ stu.ssex }}</td>
<!--?表示传值给视图函数 参数名=值 -->
<td><a href="/deleteStuById?id={{ stu.sid }}">删除</a> </td>
</tr>
{% endfor %}
</table>
</body>
</html>
效果
修改
- 点击某一条记录,调用视图函数,把这条记录显示到网页上
- 修改
回显
show_stu.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="100%">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生性别</td>
<td>删除</td>
</tr>
{% for stu in students %}
<tr>
<td>{{ stu.sid }}</td>
<td>{{ stu.sname }}</td>
<td>{{ stu.ssex }}</td>
<!--?表示传值给视图函数 参数名=值 -->
<td><a href="/deleteStuById?id={{ stu.sid }}">删除</a> </td>
<td><a href="/findStuById?id={{ stu.sid }}">修改</a> </td>
</tr>
{% endfor %}
</table>
</body>
</html>
urls.py
"""untitled URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from stu.views import showStu, addStu, findStu, showIndex, deleteStuById, findStuById
urlpatterns = [
path('admin/', admin.site.urls),
path('showStu/', showStu),
path('addStu/', addStu),
path('showIndex/', showIndex),
path('findStu/',findStu),
path('deleteStuById/',deleteStuById),
path('findStuById',findStuById),
]
views.py
from django.shortcuts import render
# request表示浏览器向django请求网页,佩戴的浏览器信息:比如,浏览器向django要显示add_stu.html
from stu.models import Student
def showStu(request):
return render(request, "add_stu.html")
def addStu(request):
name=request.POST.get("sname")
sex=request.POST.get("ssex")
stu=Student.objects.create(sname=name,ssex=sex)
#或者stu=Student(sname=name,ssex=sex)
stu.save()
return render(request,"add_stu.html")
def showIndex(reuqest):
return render(reuqest,"index.html")
def findStu(request):
#从表中获取数据
students=Student.objects.all()
#表示把数据带到网页上
return render(request,"show_stu.html",{"students":students})
def deleteStuById(request):
id=request.GET.get("id")
Student.objects.filter(sid=id).delete()
#再查询一遍
students=Student.objects.all()
return render(request, "show_stu.html", {"students": students})
def findStuById(request):
id=request.GET.get("id")
stu=Student.objects.filter(sid=id).first()
return render(request,"update_stu.html",{"students":stu})
修改
就是把form中的input项的值发给视图函数,视图函数再把这个值发给模型(表)
update_stu.html
views.py
urls.py
错误1:没写“/",会导致找不到网页
错误2:save没写括号,会导致修改失败
自己定义模型
(下面这几个是考试可能会考察的内容)
已经利用模型实现单表的增删改查,现在不想用模型来操作数据库
自己定义模型
增加
tests.py
from django.test import TestCase
import pymysql
# Create your tests here.
class Stu:
def __init__(self,sid,sname,ssex):
self.sid=sid
self.sname=sname
self.ssex=ssex
class StuDao:
def __init__(self):
#建立连接
self.con=pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="jtxy")
def add(self,name,sex):
#得到操作数据库游标对象
cur=self.con.cursor()
#执行insert sql %s表示字符串
cur.execute("insert into stu values('%s','%s',null)"%(name,sex))
#提交sql
self.con.commit()
#关闭连接、释放内存
self.con.close()
view.py
查询
tests.py
def findStudent(self):
cur=self.con.cursor()
cur.execute("select sid,sname,ssex from stu")
#获取学生表的所有记录列表 studentsList[[1,zhangsan,nan],[2,wangwu,nan]]
studentList=cur.fetchall()
stuList=[]
for lst in studentList:
stuList.append(Stu(lst[0],lst[1],lst[2]))
#关闭连接释放内存
self.con.close()
return stuList
views.py
删除
错误:
解决:这个括号少了
修改
回显
views.py
括号又忘了,服了
tests.py
def findById(self,id):
#跟查询差不多
cur = self.con.cursor()
cur.execute("select sid,sname,ssex from stu where sid=%d"%(int(id)))
# 获取学生表的所有记录列表 studentsList[[1,zhangsan,nan],[2,wangwu,nan]]
lst = cur.fetchone()
stu=Stu(lst[0], lst[1], lst[2])
# 关闭连接、释放内存
self.con.close()
return stu
修改
错误:
解决:需要转换成int
错误:
解决:sql语句需要加‘’,sql语句格式别写错
错误:
解决:别关闭连接
* 网页补充
<ul>无序列表
<li>
<ol>有序列表
<div>块(矩形)标记
<img>图片
图片
创建一个static包存图片
配置settings.py
<div>块
<div style="border: 1px;border-style: solid;width: 200px;height: 500px">
那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容
那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容
那日容那日容那日容那日容那日容那日容那日容那日容那日容那日容
</div>