建立一个数据库要先想好各个表的对应关系:一对1、一对多、多对多;html
表结构:班级、学生、老师python
基于这个关系,建立了以下数据库:mysql
先对班级class进行操做试一下:sql
之前咱们写的程序都放在urls.py文件里,显得复杂而不够专业!因此咱们能够新建一个目录好比叫 /app01/,再新建一个views.py(路径会自动添加,注意核对好)数据库
这样之后就能够在 urls.py写:django
from app01 import views
...
urlpatterns = [
#path('admin/', admin.site.urls),
path('classes',views.classes)
]
那是否是咱们就须要在 views.py 里定义一个classes的函数:服务器
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.shortcuts import render #展现班级 def classes(request): import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@123', db='oldboys',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立游标 cursor.execute("select id,title from class") #执行SQL class_list = cursor.fetchall() cursor.close() #关闭游标 conn.close() #关闭链接 return render(request,'classes.html',{'class_list':class_list})
真情连接:更多数据库操做请看武sir-Python开发【第十九篇】:Python操做MySQL | python开发【第一篇】app
那上面就实现了链接数据库取得数据的操做,那如何展示出来呢?就是建立一个return的那个 class.html 文件:函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班级</title> </head> <body> <h1>班级列表</h1> <table> <thead> <tr> <th>ID</th> <th>班级名称</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
看,最终的实现流程是:Djando 经过urls.py路由对应里找到新目录的views.py导入的函数classes, 这个函数再渲染classes.html展现页,包含了特殊标记。展现表单以循环实现。fetch
最终这样,实现数据库数据及时展示:
这样不算完,咱们还有一个添加数据的需求:
就是在展现界面,添加一个<a>标签,实现增长一个班级的操做。(页面跳转)
<body> <h1>班级列表</h1> <div> <a href="/add_class/">添加</a> </div> <table> <thead> <tr> <th>ID</th> <th>班级名称</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> </tr> {% endfor %} </tbody> </table> </body>
咱们在templates下新建一个add_class.html的简单增长界面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加班级</title> </head> <body> <h1>增长班级</h1> <form method="POST" action="/add_class/"> <p>班级名称:</p> <input type="text" name="title" required autofocus /><br> <input type="submit" value="提交" /> </form></body> </html>
这样再修改路由urls
urlpatterns = [ #path('admin/', admin.site.urls), path('classes/',views.classes), path('add_class',views.add_class), ]
而后再在views.py里建立一个add_class的函数:
... #添加班级 def add_class(request): #判断提交方式来区分什么操做 if request.method == "GET": return render(request,'add_class.html') else: #print(request.POST) v = request.POST.get('title') #将title值添加到数据库 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='X123!@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("insert into class(title) values(%s)",[v,]) conn.commit() #提交 cursor.close() conn.close() #提交完再跳转到展现页 return redirect('/classes/')
假设要删除一行数据,是否是须要把ID拿到,请求发过去就是告诉服务端要删除谁。那怎么传递这个id参数呢?
用到/?nid={{row.id}}
因此改的classes,html展现页:
<body> <h1>班级列表</h1> <div> <a href="/add_class/">添加</a> </div> <table> <thead> <tr> <th>ID</th> <th>班级名称</th> <th>操做</th> </tr> </thead> <tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> <td><a href="/del_class/?nid={{ row.id }}">删除</a></td> </tr> {% endfor %} </tbody> </table> </body>
对应咱们要在路由urls.py再增长对应:
path('del_class/',views.del_class),
再在views.py增长del_class函数:
... #删除班级 def del_class(request): nid = request.GET.get('nid') # 数据库操做 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("delete from class where id=%s", [nid, ]) conn.commit() # 提交 cursor.close() conn.close() # 提交完再跳转到展现页 return redirect('/classes/')
因而可知http是一次请求一次响应。
这个时候咱们发现光有删除是不够的,还须要一个编辑,修改class.html文件:
<tbody> {% for row in class_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> <td> <a href="/edit_class/?nid={{ row.id }}">编辑</a> | <a href="/del_class/?nid={{ row.id }}">删除</a> </td> </tr> {% endfor %} </tbody>
这样有了点击按钮,咱们就要设置下路由urls.py
path('edit_class/',views.edit_class),
再在templates下增长一个edit_class.html
添加默认值放到表格的value中,就至关于添加原始值了;
id和titlle要一块儿发过去,否则不知道修改谁。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑班级</title> </head> <body> <h1>编辑班级</h1> <!--<form method="POST" action="/edit_class/" >>--> <form method="POST" action="/edit_class/?nid={{ result.id }}" <p>班级名称:</p> <!--<input style="display: none" name="id" value="{{ result.id }}"/><br>>--> <input type="text" name="title" value="{{ result.title }}" autofocus /><br> <input type="submit" value="提交" /> </form> </body> </html>
而后对应到views.py写个edit_class的函数:
... #编辑班级 def edit_class(request): if request.method == "GET": nid = request.GET.get('nid') # 数据库操做 import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select id,title from class where id=%s", [nid, ]) result = cursor.fetchone() # 获取原始值 cursor.close() conn.close() return render(request, 'edit_class.html', {'result': result}) else: #是POST请求时,提交新的数据到数据库 #nid = request.POST.get('id') 这个对应隐藏标签操做 nid = request.GET.get('nid') title = request.POST.get('title') import pymysql conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("update class set title=%s where id=%s", [title,nid, ]) conn.commit() cursor.close() conn.close() return redirect('/classes/')
注:值得注意的是,此时提交编辑的数据是要连带id一块儿提交的,由于提交操做又是一种新的请求,否则服务器不知道对应的哪一个修改。
因此带id提交有两种方式能够实现:
1.POST提交表单时也写入<input>id 只不过利用dispaly=none属性将其隐藏用户看不到了,但实际他就在那而后一块儿提交给数据库了,这个时对应的操做数据库提取的就都是POST.get
2,也能够不隐藏,由于能够在url中携带nid,因此<form method="POST" action="/edit_class/?nid={{ result.uid }}">,而后提交数据库nid就从GET.get取,title仍是POST.get中取。
这样就完成数据库的增删改查操做!
原创文章!转载请在明显处注明出处及连接,多谢合做~