从零开始的Django框架入门到实战教程(内含实战实例) - 02 请求与相应、数据库操作(ORM、MySQL)(学习笔记)

11 篇文章 55 订阅

  Django是目前比较火爆的框架,之前有在知乎刷到,很多毕业生进入大厂实习后因为不会git和Django框架3天就被踢掉了,因为他们很难把自己的工作融入到整个组的工作中。因此,我尝试自学Django并整理出如下笔记。
  在这部分,我将从最基本的网页的请求和响应做起,然后探索Django框架中的数据库操作(ORM),包括连接MySQL、数据库的增删改查操作、前端展示。最后利用所学完成一个学生系统的展示。

1. 请求和相应(request.method, request.GET, render, redirect)

​ 我们在这里做几个尝试:

  1. 查看request的方法和类型
  2. 接受并输出URL传过来的信息
  3. 尝试redirect

​ views.py:

# *coding:utf-8*
from django.shortcuts import render, redirect
from django.http import HttpResponse

def AskAndAnswer(request):
    # 1. 查看request的方法和类型
    print(request.method)
    # 2. 接受并输出URL传过来的信息
    print(request.GET)
    # 相应有好几种:
    # 1.
    # return HttpResponse("!")
    # 2.
    # return render(request, "AskAndAns.html")
    # 3.重定向
    return redirect(r"https://www.baidu.com")

​ 我们输入此地址http://127.0.0.1:1129/AskAndAns/?n1=1,得到这个如下返回,并跳转到百度首页。

在这里插入图片描述

​ 利用这部分的知识,我们已经可以完成一个用户登录界面的制作了。见案例1

2. 数据库操作(ORM框架)

2.1 ORM

​ 我们知道python里面是有直接对数据库做增删改查的包(pymysql)的,我们当然可以把这个包用在Django中,但是我不打算这么做,因为Django里面内置了开发数据库用的ORM框架,更加方便。

在这里插入图片描述

​ ORM实际上就是一个“翻译”,将我们的在Django框架中的python指令转化为数据库的SQL语句,最后到数据库中执行这些语句。

​ ORM的主要功能:

  1. 创建、修改、删除数据库中的表(不能创建库)=> 不需要SQL语句
  2. 操作表中的数据(增删改查)=>不需要SQL语句

2.2 安装第三方模块(mysqlclient)

​ 得安装一个东西在底层链接mySQL,我们这里选取mysqlclient。

pip install mysqlclient

2.3 创建数据库

​ 因为我们没法通过ORM创建数据库,所以采取自己手动创建数据库的方式完成。没有MySQL数据库的可以搜索MySQL的安装和配置教程,类似的手把手教程网上一抓一大把。新手安装可能有坑,我尝试过超级详细的mysql安装和配置教程_933711的博客-CSDN博客_mysql安装教程,但是修改密码的时候跳不过初始的密码,尝试了很久之后发现还是这篇比较好用,直接删了重新装一遍:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)_huang6ing的博客-CSDN博客。当然这两篇博客仅供参考,毕竟每个人遇到的问题都不一样,而且我们的重点也不在这里。

​ 在终端启动MySQL:

net start mysql

在这里插入图片描述

​ 登录MySQL,并输入密码:

mysql -u root -p

在这里插入图片描述

​ 创建名为test的数据库:

 create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

在这里插入图片描述

​ 查看是否创建:

show databases;

在这里插入图片描述

2.4 ORM链接数据库

​ 在setting.py中 进行配置和修改。我们不用Django默认的数据库(sqlite3),我们用自己的。记得改数据库的名字、用户和密码。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '610129',
        'HOSR': '127.0.0.1',
        'POST': '3306',
    }
}

2.5 ORM进行表操作(makemigrations, migrate)

​ 操作分为增删改查,查没啥好说的,这里演示增删改:

2.5.1 创建表

​ 我们先在model.py中加入如下代码,Django会将这个类中的指令转化为SQL语句。

from django.db import models

# Create your models here.
# 写一个继承models.Model的类
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=64)
    age = models.IntegerField()

在这里插入图片描述

​ 写完配置,肯定是要执行的,在终端中输入命令。注意位置在文件的根目录。app也要注册到settings中。

python manage.py makemigrations
python manage.py migrate

​ 命令执行前:

在这里插入图片描述

​ 执行命令后:

在这里插入图片描述

​ 只有第一个表是我们的表,其他的表都是Django为了执行一些默认的功能所创建的表,可以到setting中的ISTALLED_APPS中查看。我们在此关注第一个我们的表。

在这里插入图片描述

​ 如果还想创建表,那就再写一个类,再执行一下makemigrations migrate语句。

class StudentInfo(models.Model):
    name = models.CharField(max_length=32)
    height = models.IntegerField()

在这里插入图片描述

2.5.2 删除表

​ 这个也简单,直接把对应的类注释掉,然后再执行一下makemigrations migrate语句,那个表就没了。

在这里插入图片描述

2.5.3 修改表

​ 修改表同上,直接再class里面修改,最后再执行一下makemigrations migrate语句,这里就不演示了。

​ 注意:安全起见,Django在增加列的时候会设置选项,第一个选项为新列赋初值,第二个选项是取消增加列。以students类为例,我们增加两列:

class StudentInfo(models.Model):
    name = models.CharField(max_length=32)
    height = models.IntegerField()
    weight = models.IntegerField(default=100)
    age = models.IntegerField()

在这里插入图片描述

​ 我们选择1,并将默认值设置为100:

在这里插入图片描述

​ 当然我们也可以允许数据为空,就是参数设置的时候写null = True, blank = True ,这样就不会报1 2选项了。

2.6 ORM数据操作

	### 2.6.1 加入数据(creat)

​ 在views.py中建立页面:

def orm(request):
    from application01.models import StudentInfo
    StudentInfo.objects.create(name="Clark", height=182, weight=68, age=20)
    StudentInfo.objects.create(name="Olsen", height=168, weight=50, age=33)
    return HttpResponse("success!!")

​ 运行成功:

在这里插入图片描述

在这里插入图片描述

2.6.2 删除数据(filter, delete)

​ view.py:

def orm(request):
    from application01.models import StudentInfo
    StudentInfo.objects.filter(name="Clark").delete()
    # 全都删掉
    # StudentInfo.objects.all().delete()
    return HttpResponse("success!!")

​ 删除成功:

在这里插入图片描述

2.6.3 筛选数据

无条件查看

​ view.py

def orm(request):
    from application01.models import StudentInfo
    data_list = StudentInfo.objects.all()
    return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])

在这里插入图片描述

筛选查看

​ view.py

def orm(request):
    from application01.models import StudentInfo
    data_list = StudentInfo.objects.filter(name='Clark')
    # 取第一个
    data_list = StudentInfo.objects.filter(name='Clark').first()
    return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])

在这里插入图片描述

2.6.4 更新数据(update)

​ view.py

def orm(request):
    from application01.models import StudentInfo
    StudentInfo.objects.filter(name="Clark").update(name = "ZLP")
    data_list = StudentInfo.objects.all()
    return HttpResponse([[i.name, i.height, i.weight, i.age] for i in data_list])

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Isqd5W4z-1656576076671)(image-20220629145226034.png)]

3. 案例1(用户登录界面)

​ 设计一个界面,可以输入用户名和密码,并且能把用户名和密码传回给我们。

​ view.py

# *coding:utf-8*
from django.shortcuts import render, redirect
from django.http import HttpResponse
# Create your views here.

def AskAndAnswer(request):
    if request.method == "GET":
        return render(request, "AskAndAns.html")
    print(request.POST)
    username = request.POST.get("user")
    password = request.POST.get("pwd")
    if username == "ClarkHu" and password == "I love Olsen":
        return HttpResponse("登录成功!!")
    return render(request, "AskAndAns.html", {"error_msg": "用户名或密码错误"})

​ AskAndAns.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录界面</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/AskAndAns/">
<!--        为了解决Django自带的验证机制,如果没有这个,提交之后就会报forbidden-->
        {% csrf_token %}
        <input type="text" name="user" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="submit" value="提交">
        <span style="color: red">{{ error_msg }}</span>
    </form>
</body>
</html>

​ 效果如下:

在这里插入图片描述

​ 返回值如下,第一个参数就是Django自带的校验参数,如果没有它,Django会认为这个请求时非法请求,不就会给一个forbidden:

在这里插入图片描述

4. 案例2(学生管理界面)

​ 这实际上就是对增删改查操作的应用,我们根据功能一步一步实现:

  • 展示用户列表

​ views.py

def student(request):
    from application01.models import StudentInfo
    data_list = StudentInfo.objects.all()
    return render(request, "students.html", {"data_list": data_list})

​ students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Students</title>
</head>
<body>
    <h1>
        学生表:
    </h1>
    <a href="/ORM/Students_add">
        <button>添加</button>
    </a>
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>身高</th>
                <th>体重</th>
                <th>年龄</th>
            </tr>
        </thead>
        <tbody>
        {% for obj in data_list %}
            <tr>
<!--                这段循环我也不知道为什么没有运行起来-->
<!--                {% for k, v in obj.items %}-->
<!--                    <td>{{ v }}</td>-->
<!--                {% endfor %}-->
                <td>{{ obj.id }}</td>
                <td>{{ obj.name }}</td>
                <td>{{ obj.height }}</td>
                <td>{{ obj.weight }}</td>
                <td>{{ obj.age }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</body>
</html>

​ 效果如下:

在这里插入图片描述

  • 添加用户

​ views.py:

ef student_add(request):
    from application01.models import StudentInfo
    if request.method == "GET":
        return render(request, "stu_add.html")
    else:
        # 获取数据
        name = request.POST.get("name")
        height = request.POST.get("height")
        weight = request.POST.get("weight")
        age = request.POST.get("age")
        # 连通数据库
        StudentInfo.objects.create(name=name, height=height, weight=weight, age=age)
        # 跳转回去
        return redirect("/ORM/Students")

​ stu_add.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>添加用户</h1>
  <form method="post" action="/ORM/Students_add">
      {% csrf_token %}
      <input type="text" name="name" placeholder="姓名">
      <input type="text" name="height" placeholder="身高">
      <input type="text" name="weight" placeholder="体重">
      <input type="text" name="age" placeholder="年龄">
      <input type="submit" value="提交">
  </form>

</body>
</html>
  • 删除用户

​ views.py:

def student_del(request):
    from application01.models import StudentInfo
    nid = request.GET.get("nid")
    StudentInfo.objects.filter(id=nid).delete()
    return redirect("/ORM/Students")

​ 修改students.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Students</title>
</head>
<body>
    <h1>
        学生表:
    </h1>
    <a href="/ORM/Students_add">
        <button>添加</button>
    </a>
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>身高</th>
                <th>体重</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
        {% for obj in data_list %}
            <tr>
<!--                这段循环我也不知道为什么没有运行起来-->
<!--                {% for k, v in obj.items %}-->
<!--                    <td>{{ v }}</td>-->
<!--                {% endfor %}-->
                <td>{{ obj.id }}</td>
                <td>{{ obj.name }}</td>
                <td>{{ obj.height }}</td>
                <td>{{ obj.weight }}</td>
                <td>{{ obj.age }}</td>
                <td><a href="/ORM/Students_del?nid={{obj.id}}"><button>删除</button></a></td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</body>
</html>

​ 系统效果如下:

在这里插入图片描述

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铖铖的花嫁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值