Django(出版社功能)

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">&laquo;</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">&raquo;</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">&times;</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. 上传文件

原文地址:https://www.cnblogs.com/112358nizhipeng/p/10307497.html