day62
day62 2018-05-02
1. 内容回顾
Django
1. 安装
1. Django版本 1.11.xx
2. 安装方式
1. 命令行 --> Python环境(双版本,pip的使用)
2. PyCharm安装
2. 创建Django项目
1. 创建方式
1. 命令行创建方式
1. cd到你要保存Django项目的目录
2. Django-admin startproject 项目名 --> 会在当前目录创建Django项目
2. PyCharm创建方式
1. File --> new project --> ...
2. 创建完之后一定要选在新窗口打开!!!
3. 配置Django项目
1. settings.py文件
1. templates文件夹的位置
2. 静态文件
1. STATIC_URL --> 静态文件夹的别名(在HTML文件中用的)
2. STATICFILES_DIRS --> 静态文件夹的真正路径
3. 注释掉 csrf 相关的中间件
4. Django项目连接的数据库信息
4. Django WEB请求流程(简版)
1. 启动Django项目,等待用户连接
2. 浏览器在地址栏输入URL,来连接我的Django项目
3. 在urls.py中 找 路径和函数的 对应关系
4. 执行对应的函数
5. 返回响应
5. views.py
1. 专门用来定义处理请求的函数
1. 基本必备三件套
from django.shortcuts import HttpResponse, render, redirect
1. HttpResponse("要返回的内容") --> 通常用于直接返回数据
2. render(request, "html文件", {"k1": v1}) --> 返回一个HTML文件或者打开文件进行字符串替换
3. redirect("URL") --> 告诉用户的浏览器去访问其他的URL
2. request相关
1. request.method --> 查看请求的方法
2. request.POST --> 获取POST请求的数据
6. ORM使用
1. 什么是ORM?
是一种编程的方法论(模型), 和语言无关.(其他的语言也有类似的实现.)
2. ORM的本质:
类 ---> 数据表
对象 ---> 数据行
属性 ---> 字段
按照规定的语法写,自动翻译成对应的SQL语句.
3. ORM的功能:
ORM操作数据表
ORM操作数据行
4. Django里ORM的使用:
1. 手动创建数据库
2. 在settings.py里面,配置数据库的连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day62',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
}
}
3. 在项目/__init__.py告诉Django用pymysql模块代替MySQLdb来连接MySQL数据库
import pymysql
pymysql.install_as_MySQLdb()
4. 在app/models.py里面定义类
# 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True) # 自增的ID主键
# 创建一个varchar(64)的唯一的不为空的字段
name = models.CharField(max_length=64, null=False, unique=True)
5. 执行两个命令
1. python3 manage.py makemigrations --> 把models.py里面的更改记录到小本本上
2. python3 manage.py migrate --> 把更改翻译成SQL语句,去数据库执行
路径参数,可知删除和编辑的是哪一个ID项。
登陆、删除和添加过程
添加页面
编辑过程
编辑页面:
以上内容详细程序
add_publisher.html
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>添加出版社</title> 6 <!--支持移动端适配--> 7 <meta name="viewport" content="width=device-width, initial-scale=1"> 8 </head> 9 <body> 10 11 <h1>添加出版社</h1> 12 <form action="/add_publisher/" method="post"> 13 {# 输入放入publisher_name中#} 14 <input type="text" name="publisher_name"> 15 <input type="submit" value="提交"> 16 <p style="color: red">{{ error }}</p> 17 </form> 18 19 </body> 20 </html>
edit_publisher.html
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>编辑出版社</title> 6 <!--支持移动端适配--> 7 <meta name="viewport" content="width=device-width, initial-scale=1"> 8 </head> 9 <body> 10 11 <h1>编辑出版社</h1> 12 <form action="/edit_publisher/" method="post"> 13 <input type="text" name="id" value="{{ publisher.id }}" style="display: none"> 14 {# 输入放入publisher_name中#} 15 <input type="text" name="edit_name", value="{{ publisher.name }}"> 16 <input type="submit" value="提交"> 17 <p style="color: red">{{ error }}</p> 18 </form> 19 20 </body> 21 </html>
publisher_list.html
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>出版社列表</title> 6 <!--支持移动端适配--> 7 <meta name="viewport" content="width=device-width, initial-scale=1"> 8 </head> 9 <body> 10 11 <a href="/add_publisher/">添加新出版社</a> 12 <table border="1"> 13 <thead> 14 <tr> 15 <th>序号</th> 16 <th>ID</th> 17 <th>出版社名字</th> 18 <th>操作</th> 19 </tr> 20 </thead> 21 22 <tbody> 23 {% for publisher in publisher_list %} 24 <tr> 25 26 <td>{{ forloop.counter }}</td> 27 <td>{{ publisher.id }}</td> 28 <td>{{ publisher.name }}</td> 29 {# <td>#} 30 {# <a class="btn btn-danger" href="/delete_publisher/?id={{ publisher.id }}">删除</a>#} 31 {# <a class="btn btn-info" href="/edit_publisher/?id={{ publisher.id }}">编辑</a>#} 32 {# </td>#} 33 <td> 34 {# url携带参数的固定写法#} 35 <a href="/delete_publisher/?id={{ publisher.id }}">删除</a> 36 {# / / 表示在当前网站不同地址间跳转#} 37 <a href="/edit_publisher/?id={{ publisher.id }}">编辑</a> 38 </td> 39 </tr> 40 {% endfor %} 41 </tbody> 42 43 </table> 44 45 </body> 46 </html>
views.py
1 from django.shortcuts import render, redirect, HttpResponse 2 3 from app01 import models 4 # Create your views here. 5 6 def publisher_list(request): 7 ret = models.Publisher.objects.all().order_by("id")# 按ID排序 8 return render(request, "publisher_list.html", {"publisher_list": ret}) 9 10 def add_publisher(request): 11 error_msg = "" 12 if request.method == "POST": 13 new_name = request.POST.get("publisher_name") 14 if new_name: 15 # 去数据库新建记录、 16 models.Publisher.objects.create(name=new_name) 17 # 引导用户回到出版社列表页 18 return redirect("/publisher_list") 19 else: 20 error_msg="名字不能为空" 21 22 # error_msg -> error 23 return render(request, "add_publisher.html", {"error": error_msg}) 24 25 def delete_publisher(request): 26 # 从get中取出将要删除的ID值 27 #GET得到一个字典 get根据id取值 28 del_id = request.GET.get("id", None) 29 # 如果能取到id值 30 if del_id: 31 del_obj = models.Publisher.objects.get(id=del_id) 32 #删除 33 del_obj.delete() 34 35 return redirect("/publisher_list/") 36 37 else: 38 return HttpResponse("fucking error") 39 40 def edit_publisher(request): 41 #如果是post t提交 42 if request.method == "POST": 43 edit_id = request.POST.get("id") 44 new_name = request.POST.get("edit_name") 45 # 根据id确定编辑哪一个出版社 46 edit_publisher = models.Publisher.objects.get(id=edit_id) 47 edit_publisher.name = new_name 48 edit_publisher.save()#把修改后的保存 49 50 return redirect("/publisher_list/") 51 52 #如果是get 显示页面时 需需显示待编辑的内容 53 # 获取到当前编辑的出版社对象 GET 54 edit_id = request.GET.get("id", None)# None可以默认取不到 55 if edit_id: 56 publisher_obj = models.Publisher.objects.get(id=edit_id) 57 return render(request, "edit_publisher.html", {"publisher": publisher_obj}) #取出来的值传到页面显示 58 else: 59 HttpResponse("编辑的出版社不存在!") 60 def test(request): 61 print(request.GET) 62 print(request.GET.get("id")) 63 return HttpResponse("ok")
bootstrap美化
1 <!DOCTYPE html> 2 <!-- saved from url=(0042)https://v3.bootcss.com/examples/dashboard/ --> 3 <html lang="zh-CN"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1"> 9 <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> 10 <meta name="description" content=""> 11 <meta name="author" content=""> 12 {# <link rel="icon" href="https://v3.bootcss.com/favicon.ico">#} 13 14 <title>Dashboard</title> 15 <!-- Bootstrap core CSS --> 16 <link href="/static/bootstrap/css/bootstrap.css" rel="stylesheet"> 17 <!-- Custom styles for this template --> 18 <link href="/static/dashboard.css" rel="stylesheet"> 19 <link rel="stylesheet" href="/static/fontAwesome/css/font-awesome.css"> 20 </head> 21 22 <body> 23 <nav class="navbar navbar-inverse navbar-fixed-top"> 24 <div class="container-fluid"> 25 <div class="navbar-header"> 26 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" 27 aria-expanded="false" aria-controls="navbar"> 28 <span class="sr-only">Toggle navigation</span> 29 <span class="icon-bar"></span> 30 <span class="icon-bar"></span> 31 <span class="icon-bar"></span> 32 </button> 33 <a class="navbar-brand" href="https://v3.bootcss.com/examples/dashboard/#">Project name</a> 34 </div> 35 <div id="navbar" class="navbar-collapse collapse"> 36 <ul class="nav navbar-nav navbar-right"> 37 <li><a href="https://v3.bootcss.com/examples/dashboard/#">Dashboard</a></li> 38 <li><a href="https://v3.bootcss.com/examples/dashboard/#">Settings</a></li> 39 <li><a href="https://v3.bootcss.com/examples/dashboard/#">Profile</a></li> 40 <li><a href="https://v3.bootcss.com/examples/dashboard/#">Help</a></li> 41 </ul> 42 <form class="navbar-form navbar-right"> 43 <input type="text" class="form-control" placeholder="Search..."> 44 </form> 45 </div> 46 </div> 47 </nav> 48 49 <div class="container-fluid"> 50 <div class="row"> 51 <div class="col-sm-3 col-md-2 sidebar"> 52 <ul class="nav nav-sidebar"> 53 <li class="active"><a href="/publisher_list/">出版社列表页<span class="sr-only">(current)</span></a> 54 </li> 55 <li><a href="#"></a></li> 56 <li><a href="#">Analytics</a></li> 57 <li><a href="#">Export</a></li> 58 </ul> 59 60 </div> 61 <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> 62 <h1 class="page-header">Dashboard</h1> 63 64 <div class="panel panel-primary"> 65 <!-- Default panel contents --> 66 <div class="panel-heading">出版社列表<i class="fa fa-thumb-tack" aria-hidden="true"></i></div> 67 <div class="panel-body"> 68 <div class="row" style="margin-bottom: 15px"> 69 <div class="col-md-4"> 70 <div class="input-group"> 71 <input type="text" class="form-control" placeholder="Search for..."> 72 <span class="input-group-btn"> 73 <button class="btn btn-default" type="button">搜索</button> 74 </span> 75 </div><!-- /input-group --> 76 </div><!-- /.col-md-4 --> 77 <div class="col-md-1 pull-right"> 78 <button class="btn btn-success" data-toggle="modal" data-target="#myModal">新增</button> 79 </div> 80 81 </div><!-- /.row --> 82 83 <table class="table table-bordered"> 84 <thead> 85 <tr> 86 <th>#</th> 87 <th>id</th> 88 <th>出版社名称</th> 89 <th>操作</th> 90 </tr> 91 </thead> 92 <tbody> 93 {% for publisher in publisher_list %} 94 <tr> 95 <td>{{ forloop.counter }}</td> 96 <td>{{ publisher.id }}</td> 97 <td>{{ publisher.name }}</td> 98 <td> 99 <a class="btn btn-danger" href="/delete_publisher/?id={{ publisher.id }}">删除</a> 100 <a class="btn btn-info" href="/edit_publisher/?id={{ publisher.id }}">编辑</a> 101 </td> 102 </tr> 103 {% endfor %} 104 </tbody> 105 </table> 106 107 <nav aria-label="Page navigation" class="text-right"> 108 <ul class="pagination"> 109 <li> 110 <a href="#" aria-label="Previous"> 111 <span aria-hidden="true">«</span> 112 </a> 113 </li> 114 <li><a href="#">1</a></li> 115 <li><a href="#">2</a></li> 116 <li><a href="#">3</a></li> 117 <li><a href="#">4</a></li> 118 <li><a href="#">5</a></li> 119 <li> 120 <a href="#" aria-label="Next"> 121 <span aria-hidden="true">»</span> 122 </a> 123 </li> 124 </ul> 125 </nav> 126 </div> 127 128 </div> 129 </div> 130 </div> 131 </div> 132 133 134 <div class="modal fade" tabindex="-1" role="dialog" id="myModal"> 135 <div class="modal-dialog" role="document"> 136 <div class="modal-content"> 137 <div class="modal-header"> 138 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span> 139 </button> 140 <h4 class="modal-title">用户信息</h4> 141 </div> 142 <div class="modal-body"> 143 <form class="form-horizontal"> 144 <div class="form-group"> 145 <label for="inputEmail3" class="col-sm-2 control-label">邮箱</label> 146 <div class="col-sm-10"> 147 <input type="email" class="form-control" id="inputEmail3" placeholder="Email"> 148 </div> 149 </div> 150 <div class="form-group"> 151 <label for="inputPassword3" class="col-sm-2 control-label">密码</label> 152 <div class="col-sm-10"> 153 <input type="password" class="form-control" id="inputPassword3" placeholder="Password"> 154 </div> 155 </div> 156 </form> 157 </div> 158 <div class="modal-footer"> 159 <button type="button" class="btn btn-default" data-dismiss="modal">取消</button> 160 <button type="button" class="btn btn-primary">保存</button> 161 </div> 162 </div><!-- /.modal-content --> 163 </div><!-- /.modal-dialog --> 164 </div><!-- /.modal --> 165 166 <!-- Bootstrap core JavaScript 167 ================================================== --> 168 <!-- Placed at the end of the document so the pages load faster --> 169 <script src="/static/jquery-3.2.1.min.js"></script> 170 <script src="/static/bootstrap/js/bootstrap.js"></script> 171 172 </body> 173 </html>
结果:
今日内容
1. GET请求和POST请求
都属于HTTP协议规定的请求方法
2. 什么时候用GET请求?
1. 浏览器想要得到一个HTML页面的时候
2. 搜索引擎查询关键字的时候 www.sogo.com/web/?query=迪丽热巴 (问号前是路径,问号后是路径参数)
3. 什么时候用POST?
1. 向后端提交数据
1. 大段的数据
2. 包含隐私的数据 用GET方法会在页面上显示,对隐私不安全
3. 上传文件
4. 实际中GET和POST的应用场景
1. GET:
1. 直接在浏览器地址栏输入URL访问网站
2. a标签
2. POST:
1. 登录注册
2. 修改(新增)大段的数据
3. 上传文件