目录
回顾昨天内容
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时,运行文件怎么打开
定向符百度一下