zoukankan      html  css  js  c++  java
  • 9.5Django操作数据库的增删改查

    2018-9-5 18:10:52

    先贴上笔记

    day61 2018-04-28
    
    1. 内容回顾
    
        1. HTTP协议消息的格式:
            1. 请求(request)
                请求方法 路径 HTTP/1.1
    
                k1:v1
    
                ...
    
                
    
                请求体        <-- 可以有,可以没有
            
            2. 响应(response)
                HTTP/1.1 状态码 状态描述符
    
                k1:v1
    
                Content-Type: text/html; charset=utf8
    
                
    
                响应正文       <-- HTML内容
    
        2. Python web框架的本质:
            a. 收发socket消息    --> 按照HTTP协议消息格式去解析消息
            
            b. 路径和要执行的函数的对应关系   --> 主要的业务逻辑
            
            c. 字符串替换                     --> 模板(特殊符号 --> 数据)
            
        3. 一个完整得请求流程:
            0. 启动服务端,等待客户端(用户的浏览器)来连接
            1. 在浏览器地址栏输入URL,与服务端建立连接,浏览器发送请求
            2. 服务端收到请求消息,解析请求消息,根据路径和函数的对应关系,找到将要执行的函数
            3. 执行函数,打开HTML文件,进行字符串替换,得到一个最终要返回的HTML内容
            4. 按照HTTP协议的消息格式要求,把HTML内容回复给用户浏览器(发送响应)
            5. 浏览器收到响应的消息之后,按照HTML的规则渲染页面.
            6. 关闭连接
            
        
    2. Django昨日内容梳理:
        0. Django安装
            pip3 install django==1.11.11
            
            pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django==1.11.11
        
            PyCharm安装的时候:
                注意不要勾选那个选项 (你们懂得)
    
        1. Django项目的启动:
            1. 命令行启动
                在项目的根目录下(也就是有manage.py的那个目录),运行:
                python3 manage.py runserver IP:端口--> 在指定的IP和端口启动
                python3 manage.py runserver 端口   --> 在指定的端口启动
                python3 manage.py runserver        --> 默认在本机的8000端口启动
            
            2. PyCharm启动
                点绿色的小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名)
            
        2. 配置相关   项目名/settings.py文件
            1. Templates(存放HTML文件的配置)       <-- 告诉Django去哪儿找我的HTML文件
            
            2. 静态文件(css/js/图片)
                # 静态文件保存目录的别名
                STATIC_URL = '/static/'
    
                # 所有静态文件(css/js/图片)都放在我下面你配置的文件夹中
                STATICFILES_DIRS = [
                    os.path.join(BASE_DIR, "static"),
                ]
            3. 注释掉setting.py中 带有 csrf 的那一行(大概45~47行)
            
            
    3. 今日内容
        1. 登录的完整示例
            
            
        复习:
            form表单往后端提交数据需要注意哪三点:  五一回来默写    <-- 谁写错成from谁就请大家吃雪糕
                1. form不是from,所有获取用户输入的标签都应该放在form里面, 并且必须要有name属性
                2. action属性控制往哪儿提交,method一般都设置成post
                3. 提交按钮必须是type=submit,不能是别的类型
    
    
        2. GET请求和POST请求
            GET请求:
                1. 浏览器请求一个页面
                2. 搜索引擎检索关键字的时候
                
            POST请求:
                1. 浏览器向服务端提交数据,比如登录/注册等
    
        3. Django中的APP:
            什么是APP?以及为什么要用APP?
            
            project  --> 项目  (老男孩教育大学校)
            
            APP      --> 应用  (Linux学院/Python学院/大数据学院/Java学院)
            
            方便我们在一个大的Django项目中,管理实现不同的业务功能.
            
            1. 创建APP的命令
                1. 命令行,在Django项目的根目录输入:
                    python3 manage.py startapp app名字
            
        4. ORM
        
        import pymysql
        pymysql.connect(
         ...
         ...
        )
        
        1. 不同的程序员写的SQL水平参差不齐
        2. 执行效率也参差不齐
        
        python语法   --自动翻译-->  SQL语句
        
        jQuery                      DOM
        $("#d1")     --自动翻译-->  document.getElementById("d1")
        
        ORM: 
            优点:
                1. 简单,不用自己写SQL语句
                2. 开发效率高
            缺点:
                1. 记忆你这个特殊的语法
                2. 相对于大神些的SQL语句,肯定执行效率有差距
            
        ORM的对应关系:
            类          --->      数据表
            对象        --->      数据行
            属性        --->      字段
    
        ORM能做的事儿:
            1. 操作数据表    --> 创建表/删除表/修改表
                操作models.py里面的类
            
            2. 操作数据行    --> 数据的增删改查
                
            
            不能创建数据库,自己动手创建数据库
            
        使用Django的ORM详细步骤:
            1. 自己动手创建数据库
                create database 数据库名;
            2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)
                # 数据库相关的配置
                DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.mysql',  # 连接的数据库类型
                        'HOST': '127.0.0.1',  # 连接数据库的地址
                        'PORT': 3306,  # 端口
                        'NAME': "day61",  # 数据库名称
                        'USER': 'root',  # 用户
                        'PASSWORD': '123456'  # 密码
                    }
                }
            3. 告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库
                在项目/__init__.py文件中,写下面两句:
                    import pymysql
                    # 告诉Django用pymysql来代替默认的MySQLdb
                    pymysql.install_as_MySQLdb()
            4. 在app下面的models.py文件中定义一个类,这个类必须继承models.Model
                class 类名(models.Model):
                    ...
            5. 执行两个命令
                1. python3 manage.py makemigrations
                2. python3 manage.py migrate
    
    
        ORM单表的增加和查询:
            1. 查询
                models.UserInfo.objects.all()  #这个是一个对象
                
            2. 增加
                models.UserInfo.objects.create(name="张三")
         
         3.删除
           models.UserInfo.objects.filter(id=nid).delete()
         4 修改
           models.UserInfo.objects.filter(id=nid).update(name=username)

    使用Django实现数据库的增删改查

    from django.shortcuts import render, redirect, HttpResponse
    from app01 import models
    
    
    # 专门用来放函数
    # 2018-9-4 21:32:46 睡觉去!!啦啦啦明天继续!
    def login(request):
        # 如果你是POST请求
        if request.method == "POST":  # 这里必须是大写
            # 如果你是POST请求,我就取出提交的数据,做登入判断
            # 获取用户提交数据
            email = request.POST.get("email", None)
            pwd = request.POST.get("pwd", None)
            print(email, pwd)
            # 做是否登入成功的判断
            if email == "1076176004@qq.com" and pwd == "1":
                # 登入成功
                # redirect 回复一个特殊的响应,这个响应会让用户的浏览器请求指定的URL
                return redirect("http://www.baidu.com")
            else:
                # 登入失败
                error_msg = "邮箱或密码错误"
                # render完成html页面的字符串替换
                return render(request, "login.html", {"error": error_msg})
        # 不是POST请求就走下面这一句
        return render(request, "login.html")
    
    
    # 2018-9-5 16:09:55
    # 展示所有用户的函数
    def user_list(request):
        # 去数据库中查询所有的用用户
        # 利用ORM这个工具去查询数据库,不用自己去查询
        ret = models.UserInfo.objects.all()
        print(ret[0].id, ret[0].name)
        # 打开user_html文件
        return render(request, "user_list.html", {"user_list": ret})
        # return HttpResponse("别闹了!")
    
    
    # 添加用用户的函数
    def add_user(request):
        if request.method == "POST":
            # 用户填写了新的用户名,并发送了POST请求
            new_name = request.POST.get("username", None)
            # 去数据库中新创建一条用户记录
            models.UserInfo.objects.create(name=new_name)
            # 添加成功后直接跳转到用户列表页
            return redirect("/user_list/")
        # 第一个请求页面的时候,就返回一个页面,页面上有两个框让用户填写
        return render(request, "add_user.html")
    
    
    # 修改用户的函数
    def edit_user(request):
        if request.method == "GET":
            # 找到用户的ID
            nid = request.GET.get("nid")
            # 根据id找到用户的名字  这找到的是对象
            result = models.UserInfo.objects.get(id=nid)
            # result.name   result.id
            return render(request, 'edit_user.html', {'result': result})
        else:
            nid = request.GET.get('nid')
            username = request.POST.get('username')
            models.UserInfo.objects.filter(id=nid).update(name=username)
            return redirect("/user_list/")
    
    
    # 删除用户的函数
    def del_user(request):
        # 在页面提交时候有nid
        nid = request.GET.get("nid")
        # 根据id删除user
        models.UserInfo.objects.filter(id=nid).delete()
        return redirect("/user_list/")

    user_list.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户列表页</title>
    </head>
    <body>
    
    <a href="/add_user/">添加用户</a>
    
    <table border="1">
        <thead>
        <tr>
            <th>id值</th>
            <th>用户名</th>
        </tr>
        </thead>
        <tbody>
    
        {% for user in user_list %}
            <tr>
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
    {#        提交的时候,加上nid 方便修改时候找到ID    #}
    <td><a href="/edit_user/?nid={{ user.id }}">编辑</a></td> {# 提交的时候,加上nid 方便删除时候找到ID #} <td><a href="/del_user/?nid={{ user.id }}">删除</a></td> </tr> {% endfor %} </tbody> </table> </body> </html>

    add_user.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加用户</title>
    </head>
    <body>
    
    <form action="/add_user/" method="post">
        <p>用户名:
            <input type="text" name="username">
        </p>
        
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
    
    </body>
    </html>

    edit_user.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>编辑用户</title>
    </head>
    <body>
    
    <form action="/edit_user/?nid={{ result.id }}" method="post" >
        <p>用户名:
            <input type="text" name="username" value="{{ result.name}}">
        </p>
    
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
    
    </body>
    </html>
  • 相关阅读:
    CSS:关于CSS Hack
    JS数据交互:动态从数据库中获取数据填充Select
    Oracle数据库—— 事务处理与并发控制
    Java 实现任意N阶幻方的构造
    Java 实现奇数阶幻方的构造
    Web前端开发笔试&面试_03
    任意多边形的几何变换
    关于网站劫持
    mysql 出现Host 'localhost' is not allowed to connect to this MySQL server 错误
    mysql 导入表数据中文乱码
  • 原文地址:https://www.cnblogs.com/zhen1996/p/9593695.html
Copyright © 2011-2022 走看看