目录
回顾昨天内容
1. web应用的本质 socket模块写的服务端 a. 路由系统 url和函数的对应关系 flask、django、torando中存在 b. 模板引擎 (渲染) 将服务端处理好的数据替换到html页面(模板)中 静态资源(文件) :css、js、img 2. django a. django中的路由: urls.py: def f1(request): pass urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index/', index), url(r'^f1/', f1), ] b. 模板: 渲染: render(request, "index.html") 渲染数据类型: 简单数据: name = ‘zekai’ render(request, "index.html", {'name':name}) html: {{name}} 列表渲染: li = ['aaa', 'bbb', 'ccc'] render(request, "index.html", {'li':li}) html: 单个: {{li.0}} {{li.1}} 循环: {% for item in li%} {{item}} {% endfor %} 字典渲染: dict = {"name":'zekai', 'age':18} render(request, "index.html", {'dict':dict}) html: 单个: {{dict.name}} 循环: keys: {% for item in dict.keys %} {{item}} {% endfor %} values: {% for item in dict.values %} {{item}} {% endfor %} {% for key, val in dict.items %} {{key}} -- {{val}} {% endfor %} 列表中套字典: {% for item in dict.keys %} {{item}} {% endfor %}
今日内容
课程表,学生表,老师表,课程与老师的关系表: 增删改查 新URL的方式,模态框ajax方式
学员管理系统
表结构
班级表 (单表的操作) classes: cid cname 1 脱产九期 2 脱产99期 学生表 (一对多关系操作) students sid sname cid (外键关联classes表cid) 1 雷俊 1 2 lala 1 3 haha 2 老师表 (单表操作) teacher tid tname 1 zekai 2 sean 3 owen 4 jerry 5 nick 老师对班级表 (多对多的关系) teacher2class id tid(外键teacher表tid) cid(外键classes表的cid) 1 1 1 2 1 2 3 2 1 - 新URL的方式 - 模态框ajax方式 今天的作业: 1. 登录 (pymysql连接) 2. 删除(加上确认删除的效果) 3. 增加删除修改查询 (新url的方式)
main
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生管理系统</title> <style> div { height: 400px; width: 300px; margin: 100px auto; background-color: #ccc; text-align: center; } p { display: block; padding-top: 150px; } </style> </head> <body> <div> <p><a href="/login/">sign in</a></p> <a href="/register/">sign up</a> </div> </body> </html>
python
from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse, render, redirect import pymysql def main(request): return render(request, 'main.html')
登录:
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录界面</title> <style> div { height: 400px; width: 300px; margin: 0 auto; background-color: #ccc; } p { color: red; text-align: center; } </style> </head> <body> <div> <h2>登录界面</h2> <form action="/login/" method="post"> 用户名:<input type="text" name="username"><br> 密 码:<input type="password" name="pwd"><br> <button type="submit">提交</button> <!-- 接受验证结果 --> <p>{{ res }}</p> </form> </div> </body> </html>
python
def login(request): # 判断是什么模式 if request.method == 'GET': return render(request, 'login.html') elif request.method == 'POST': # 获取用户名和密码 username = request.POST.get('username') pwd = request.POST.get('pwd') # print(username) # print(pwd) # 连接数据库进行验证 conn = pymysql.connect( user = 'root', password = '123', database = 't3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'select * from user where username = %s and pwd = %s' # 进行数据验证 if cursor.execute(sql, (username, pwd)): return redirect('/classes/') else: return render(request, 'login.html', {'res': '登录失败'})
注册
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册界面</title> <style> div { height: 400px; width: 300px; margin: 0 auto; background-color: #ccc; } p { color: red; text-align: center; } </style> </head> <body> <div> <h2>注册界面</h2> <form action="/register/" method="post"> 用户名:<input type="text" name="username"><br> 密 码:<input type="password" name="pwd"><br> <button type="submit">提交</button> <p>{{ res }}</p> </form> </div> </body> </html>
python
def register(request): if request.method == 'GET': return render(request, 'register.html') elif request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') if not (username and pwd) : return render(request, 'register.html', {'res': '帐号密码不能为空'}) conn = pymysql.connect( user = 'root', password = '123', db = 't3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'select * from user where username=%s' if cursor.execute(sql, (username,)): return render(request, 'register.html', {'res': '帐号已注册'}) sql = 'insert into user(username, pwd) values(%s, %s)' cursor.execute(sql, (username, pwd)) conn.commit() return render(request, 'register.html', {'res': '注册成功,即将在3秒后跳转登录界面...'}) else: return HttpResponse('404 not found')
显示数据
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> a { text-decoration: none; } td a:nth-child(1) { color: red; } </style> {# 遮盖层 #} <style> .cover { position: fixed; top: 0; left: 0; bottom: 0; right: 0; background-color: black; opacity: 0.4; display: none; } </style> {# 弹出框层 #} <style> .up { height: 250px; width: 400px; top: 100px; left: calc(50% - 200px); border: 1px solid; position: fixed; background-color: white; text-align: center; display: none; } </style> </head> <body> <h1><a href="/classes/">学生管理系统</a></h1> <h2>班级目录</h2> <table border="1px"> <thead> <tr> <th>ID</th> <th>班级名称</th> <th>操作</th> </tr> </thead> <tbody> {% for i in classes %} <tr> <td>{{ i.cid }}</td> <td>{{ i.cname }}</td> <td> <a class="aaa" href="/delete_cl?cid={{ i.cid }}" name="">删除</a>| <a href="/update_cl?cid={{ i.cid }}">更新</a>| <button class="ajax_up" type="button">ajax更新</button> </td> </tr> {% endfor %} </tbody> </table> <div> <button> <a href="/create_cl/">添加班级</a> </button> <button type="button" class="ajax_create">ajax添加</button> </div> {#遮盖层#} <div class="cover"> </div> {#添加弹出层#} <div class="up create_up"> <h3>添加课程</h3> 请输入课程名:<input type="text"> <button type="submit" class="create_btn">提交</button> <button type="button">取消</button> </div> {#更新弹出层#} <div class="up update_up"> <h3>更新课程</h3> <input class="update_cid" type="hidden"> 请输入课程名:<input class="update_classname" type="text"> <button type="submit" class="update_btn">提交</button> <button type="button">取消</button> </div> </body> </html>
增删改查(新url)
增
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>新增</title> <style> </style> </head> <body> <h1><a href="/classes/">学生管理系统</a></h1> <h2>新增班级</h2> <form action="/create_cl/" method="post"> <label for="cn">classname:</label> <input id="cn" type="text" name="classname" placeholder="请输入班级名称"> <button type="submit">提交</button> </form> </body> </html>
python
def create_class(request): if request.method == 'GET': return render(request, 'create_class.html') elif request.method == 'POST': classname = request.POST.get('classname') conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'insert into classes(cname) values(%s)' if cursor.execute(sql, (classname,)): conn.commit() return redirect('/classes/') else: return redirect('/create_cl/') else: return HttpResponse('404 not found')
删(无html,不分url和ajax)
python
def delete_class(request): cid = request.GET.get('cid') conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'delete from classes where cid=%s' cursor.execute(sql, (cid,)) conn.commit() return redirect('/classes/')
改
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>更新</title> <style> </style> </head> <body> <h1><a href="/classes/">学生管理系统</a></h1> <h2>更新班级信息</h2> <form action="" method="post"> <input type="hidden" name="cid" value="{{ classes.cid }}"> <input type="text" name="cname" value="{{ classes.cname }}"> <button type="submit">确认修改</button> </form> </body> </html>
python
def update_class(request): if request.method == 'GET': cid = request.GET.get('cid') # print(cid) conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'select * from classes where cid=%s' cursor.execute(sql, (cid,)) classes = cursor.fetchone() return render(request, 'update_class.html', {'classes': classes}) elif request.method == 'POST': cid = request.POST.get('cid') cname = request.POST.get('cname') conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'update classes set cname=%s where cid=%s' cursor.execute(sql, (cname, cid)) conn.commit() return redirect('/classes/') else: return HttpResponse('404 not found')
增删改查(ajax)
增
def ajax_create_cl(request): # 以防不正常的进入 if request.method != 'POST': return HttpResponse('404 not found') classname = request.POST.get('classname') if not classname: return HttpResponse('false') conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'insert into classes(cname) values(%s)' if cursor.execute(sql, (classname,)): conn.commit() return HttpResponse('true') else: return HttpResponse('false')
改
def ajax_update_cl(request): if request.method != 'POST': return HttpResponse('404 not found') cid = request.POST.get("cid") classname = request.POST.get('classname') conn = pymysql.connect( user='root', password='123', db='t3' ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'update classes set cname=%s where cid=%s' cursor.execute(sql, (classname, cid)) conn.commit() return HttpResponse('true')
路由系统
urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^$', main), url(r'^login/', login), url(r'^register/', register), url(r'^classes/', show_classes), url(r'^create_cl/', create_class), url(r'^delete_cl/', delete_class), url(r'^update_cl/', update_class), url(r'^ajax_create_cl/', ajax_create_cl), url(r'^ajax_update_cl/', ajax_update_cl), ]
班级表 (单表的操作) classes: cid cname 1 脱产九期 2 脱产99期 学生表 (一对多关系操作) students sid sname cid (外键关联classes表cid) 1 雷俊 1 2 lala 1 3 haha 2 老师表 (单表操作) teacher tid tname 1 zekai 2 sean 3 owen 4 jerry 5 nick 老师对班级表 (多对多的关系) teacher2class id tid(外键teacher表tid) cid(外键classes表的cid) 1 1 1 2 1 2 3 2 1 - 新URL的方式 - 模态框ajax方式 今天的作业: 1. 登录 (pymysql连接) 2. 删除(加上确认删除的效果) 3. 增加删除修改查询 (新url的方式)
总结
多print,多console.log request.method是获取用户提交数据的类型 setTimeout(function () { window.location.href = '/login/'; }, 3000); 除了查询外多使用fetchone,而不是fetchall,因为one是字典,all是列表套字典 除了判断execute返回的值之外,还可以通过cursor.lastrowid,和conn.insert_id()来获取更新的主键值,他们的区别很小 jq中jq对象.show()相当于jq对象.css('display', 'block').hide是none 对于数据内容,前端后台都要进行判断是否为0,因为js可以被禁用,所以需要双保险 总结一下return的三种方式 httpresponse('字符串') :只能返回字符串 render(request, 'html模版文件的路径', {'参数名': 参数}) redirect('url'):直接跳转 httpresponse中必须为字符串 循环中的标签,不要使用id,不然只会有一个 总结:数据前后台传输 在浏览器中输入网址回车,是一个get请求 而在form中,可以通过method设置成post请求 get:直接将参数拼接在url后 post:不拼接,但也只是相对安全 post方式,在前端标签中,name是键,value是值,value可以指定默认值,但是如果用户输入了,就会覆盖。 后台则使用request.POST.get('键')的方式来获取值 get方式,如果是form,则正常填写就可以,如果是其他标签提交,需要在转跳的页面要加上`?参数名=参数`,模拟form提交 后台则使用request.GET.get('参数名')的方式获取值 input和button只有在form中才会提交name和value中的值,提交方式为get,则会把提交的内容添加到url后面,提交的方式为post,则不会添加 # 在登录时,达到一个虚拟的提示框的效果 在html中写一个标签,但是不写内容,只写{{res}},这样他是不会显示出来的,而当你往后台提交数据之后,可以通过后台的return render返回一个数据过来,然后前台就会显示这个标签了
当任务文件夹不是django时,运行文件怎么打开
定向符百度一下