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. <div class="modal fade" tabindex="-1" role="dialog" id="myModal">
  134. <div class="modal-dialog" role="document">
  135. <div class="modal-content">
  136. <div class="modal-header">
  137. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
  138. </button>
  139. <h4 class="modal-title">用户信息</h4>
  140. </div>
  141. <div class="modal-body">
  142. <form class="form-horizontal">
  143. <div class="form-group">
  144. <label for="inputEmail3" class="col-sm-2 control-label">邮箱</label>
  145. <div class="col-sm-10">
  146. <input type="email" class="form-control" id="inputEmail3" placeholder="Email">
  147. </div>
  148. </div>
  149. <div class="form-group">
  150. <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
  151. <div class="col-sm-10">
  152. <input type="password" class="form-control" id="inputPassword3" placeholder="Password">
  153. </div>
  154. </div>
  155. </form>
  156. </div>
  157. <div class="modal-footer">
  158. <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
  159. <button type="button" class="btn btn-primary">保存</button>
  160. </div>
  161. </div><!-- /.modal-content -->
  162. </div><!-- /.modal-dialog -->
  163. </div><!-- /.modal -->
  164.  
  165. <!-- Bootstrap core JavaScript
  166. ================================================== -->
  167. <!-- Placed at the end of the document so the pages load faster -->
  168. <script src="/static/jquery-3.2.1.min.js"></script>
  169. <script src="/static/bootstrap/js/bootstrap.js"></script>
  170.  
  171. </body>
  172. </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. 上传文件

Django(出版社功能)的更多相关文章

  1. Django 分页功能

    Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...

  2. Django——分页功能Paginator

    Django分页功能----Paginator Paginator所需参数: Paginator(object_list,per_page) Paginator常用属性: per_page: 每页显示 ...

  3. 大致掌握django的功能

    目录 静态文件配置 request对象方法初识 pycharm链接数据库(mysql) django链接数据库(mysql) django orm 字段的增删查改 数据的增删查改 数据的查,改,删 d ...

  4. Django—常用功能

    索引 一.静态文件 二.中间件 三.Admin站点 3.1 列表页选项 3.2 编辑页选项 3.3 重写模板 四.上传图片 4.1 在管理页面admin中上传图片 4.2 自定义form表单中上传图片 ...

  5. django分页功能实现

    django内置的分页功能需要引入内置模块from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger Pagina ...

  6. django分页功能

    采用django自带的Paginator功能 from django.core.paginator import Paginator food = foodInfo.objects.filter(fo ...

  7. django 用户注册功能实现

    增加views的类 class RegisterView(View): def get(self, request): return render(request, 'register.html', ...

  8. django验证码功能

    1.目的 现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录.这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的 2.StringI ...

  9. Django 文件下载功能

    def file_download(request): con= MySQLdb.connect(host='192.168.xxx.xxx',user='root',passwd='xxxx',db ...

随机推荐

  1. Oracle LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  2. SNP问题大集锦

    SNP问题大集锦 [2017-01-19]       最近小编对基因检测很感兴趣,也跟风去测了一下,这一测不要紧,吓得小编几天没睡着觉,这不,检测报告上称小编的减肥能力弱,虽然小编一家都是胖子,唯有 ...

  3. mstsc本地驱动器

    mstsc 可以把本地驱动器 挂载到服务器上

  4. <Linux多线程服务端编程>学习记录

    使用智能指针解决多线程下 类的解析冲突问题 有这样一个场景 使用StockFactory记录Stock的信息  容器是map<string,smart_ptr>; 代码如下: #inclu ...

  5. 深入应用c++11 随书代码

    代码并未在作者github上提供 将书中代码敲至vc 并调试运行 依赖BOOST库 编译环境vs2015 boost1.59 // Client.cpp : 定义控制台应用程序的入口点. // #in ...

  6. part1:4-linux快速体验

    1.Linux部分目录结构介绍 /:根目录,一般根目录下只存放目录,尽量不要存放文件:/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中. /bin:可执行二进制文件目录, ...

  7. DB2数据类型(抄袭)

    数字 数据类型        精度          最小值                                        最大值                       smal ...

  8. XAMPP Apache + MariaDB + PHP + Perl

    https://www.apachefriends.org/zh_cn/index.html 什么是XAMPP? XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版 ...

  9. 乞丐版servlet容器第3篇

    4 EventListener接口 让我们继续看SocketConnector中的acceptConnect方法: @Override protected void acceptConnect() t ...

  10. 2018.08.21 NOIP模拟 unlock(模拟+找规律)

    unlock 描述 经济危机席卷全球,L国也收到冲击,大量人员失业. 然而,作为L国的风云人物,X找到了自己的新工作.从下周开始,X将成为一个酒店的助理锁匠,当然,他得先向部门领导展示他的开锁能力. ...