django单表数据库添加,查询,删除,修改

小白的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对应起来)
  1. 创建模型
  2. 在视图函数中,把要存的值存到模型中
  3. pip insatll pymysql 安装mysql支持
  4. 在settings.py中加入自己创建的模块
  5. 根据模型手动生成sql脚本 python manage.py makemigrations
  6. 根据生成的脚本,在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

在这里插入图片描述


测试是否成功
  1. 跑起来
  2. 进入网页
  3. 提交数据
  4. 查看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>

在这里插入图片描述


查询

  1. 网页通过调用视图函数,视图函数调用模型获取数据,

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>

查看

在这里插入图片描述

在这里插入图片描述


删除

  1. 传值给视图函数
  2. 视图函数根据id删除对应数据,并再查询一边,把结果发到网页
  3. 网页读取显示

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>

在这里插入图片描述


效果

在这里插入图片描述

在这里插入图片描述


修改

  1. 点击某一条记录,调用视图函数,把这条记录显示到网页上
  2. 修改

回显

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>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值