Django request对象与ORM简介
form表单
form表单默认是以get请求提交数据的
http://127.0.0.1:8000/login/?username=admin&password=123
action参数 1.不写 默认朝当前地址提交数据 2.全路径 3.后缀(/index)
提交post请求的时候 需要先去配置文件中注释掉一行(中间件)
视图函数应该做到针对不同的请求,做出不同的处理逻辑
- get请求来 应该只需要返回一个html文件
- post请求来 应该获取用户提交的数据,然后做进一步处理
所以你必须要能够判断出当前请求到底是什么请求。
request对象
获取前端请求方式
request.method # 结果是一个纯大写的字符串 GET/POST
通常情况下针对不同的请求应该做不同的处理
def login(request):
# if request.method =='GET':
# #GET逻辑
# return render(request, 'login.html')
# elif request.method =='POST':
# #POST逻辑
# print(request.method, type(request.method)) # POST <class 'str'>
# return HttpResponse('收到了你的数据,马上处理')
# print(request.method) #获取前端请求方式
"""为了减少代码的层级:一般情况下视图函数处理get请求较多,所以可以直接在函数体内先写GET请求对应的逻辑
将其他请求利用request.method做出区分
"""
if request.method == 'POST':
return HttpResponse('收到了')
return render(request, 'login.html')
获取POST请求提交的数据:
request.POST #类似于是一个大字典
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.POST.get() # 只会取列表最后一个元素
request.POST.getlist() # 取出整个列表
如下所示,是一个简易的登录页面 login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h2 class="text-center">登录</h2>
<form action="" method="post">
<p>username:<input type="text" name="username" class="form-control"></p>
{# <p>username:<input type="text" name="username" class="form-control"></p>#}
<p>password:<input type="text" name="password" class="form-control"></p>
{# <p>hobby:#}
{# bbb<input type="checkbox" name="hobby" value="bbb">#}
{# aaa<input type="checkbox" name="hobby" value="aaa">#}
{# ccc<input type="checkbox" name="hobby" value="ccc">#}
{# </p>#}
<input type="submit" class="btn btn-success ">
</form>
</div>
</div>
</div>
</body>
</html>
针对login.html页面进行相应地取值和处理的逻辑操作
def login(request):
if request.method == 'POST':
#如何获取数据(GET和POST)
print(request.POST) #获取post请求携带的数据
#获取用户的用户名与密码
# <QueryDict: {'username': ['hank'], 'password': ['123']}>
username = request.POST.get('username') # 用get取值只会取列表最后一个元素
password = request.POST.get('password')
print(username,type(username)) #hank <class 'str'>
print(password,type(password)) #123 <class 'str'>
#如果你想直接拿到列表
hobby = request.POST.getlist('hobby') # getlist取到的是一个列表
print(hobby,type(hobby)) #['bbb', 'aaa', 'ccc'] <class 'list'> return HttpResponse('收到了')
return render(request, 'login.html')
获取符合GET请求携带数据格式的数据:
注意:GET请求获取的数据格式和POST一样
request.GET # 获取符合get请求携带数据格式的数据 url?xxx=yyy&ooo=lll
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.GET.get() # 只会取列表最后一个元素
request.GET.getlist() # 取出整个列表
针对login.html页面进行相应地取值和处理的逻辑操作
def login(request):
if request.method == 'POST':
#如何获取数据(GET和POST)
print(request.POST) #获取post请求携带的数据
#获取用户的用户名与密码
# <QueryDict: {'username': ['hank'], 'password': ['123']}>
username = request.POST.get('username') # 用get取值只会取列表最后一个元素
password = request.POST.get('password')
print(username,type(username)) #hank <class 'str'>
print(password,type(password)) #123 <class 'str'>
#如果你想直接拿到列表
hobby = request.POST.getlist('hobby') # getlist取到的是一个列表
print(hobby,type(hobby)) #['bbb', 'aaa', 'ccc'] <class 'list'> return HttpResponse('收到了')
print(request.GET)
print(request.GET.get('username'),type(request.GET.get('username')))
print(request.GET.getlist('password'),type(request.GET.getlist('password')))
return render(request,'login.html')
Django连接数据库
前提:Django连接数据库,需要你自己提前创建好对应的库
1.先去配置文件中配置相关参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #数据库的类别
'NAME': 'db1', #库的名字
'HOST':'127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '',
'CHARSET': 'utf8'
}
}
# 对于python3的使用者们还需要再加一步操作
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与项目同名或者应用下的 __init__.py文件中 import pymysql
pymysql.install_as_MySQLdb()
Django ORM简介
django orm不会帮你创建库 只能帮你自动创建表
orm对象关系映射:
类 -------> 表
对象 -------> 记录
属性 -------> 字段值
首先需要先去对应的应用下的models.py中书写你的模型类(表)
class User(models.Model):
# id int primary key auto_increment
#当你没有指定主键的时候,django orm会自动帮你创建一个名为id的主键字段
#一旦检测到你自己创建了主键字段,那么就不会再帮你创建
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32)
# password int
password = models.IntegerField()
数据库迁移(同步)命令
python3 manage.py makemigrations # 仅仅是将你对数据库的改动记录到某个小本本上(migrations文件夹) python3 manage.py migrate # 将改动真正的同步到数据库中 """
上面两个命令必须是成对出现的
"""
只要你动了models.py跟数据库相关的代码 你就必须要重新执行上面的两条命令来保证数据库与models.py一致
字段的增删改查
字段的增
1.要么给该字段设置默认值
2.要么允许该字段可以为空
字段的改
直接修改表中字段的代码 之后执行数据库迁移命令即可
字段的删
只要注释掉对应的字段 执行数据库迁移命令就会将对应的字段及数据信息全部删除(慎用)
数据的增删改查
查询数据
1、filter()
from app01 import models
res = models.User.objects.filter(username='hank') # select * from user where username='jason'
# 返回的res是一个列表
user_obj = res.first()
# filter方法条件不存在的时候,不会报错,而是返回一个空列表 """
filter括号内直接放多个关键字参数 并且多个关键字参数之间是and关系
"""
# select * from user where username='jason' and password='123';
res = models.User.objects.filter(username='jason',password='')
见如下详情:
from app01 import models def login(request):
if request.method == 'POST':
username = request.POST.get('username') # 用get取值只会取列表最后一个元素
password = request.POST.get('password') #查询数据库
#下面返回的结果可以看作是一个列表,
res = models.User.objects.filter(name=username)
# print(res) # <QuerySet [<User: User object>]>
#user_obj = res[0] # QuerySet支持索引取值但是不支持负数,不推荐使用
user_obj = res.first() #User object
print(user_obj.name,user_obj.password)
return HttpResponse('收到了')
return render(request,'login.html')
2、查所有的数据
filter() 括号内不写任何参数就是 查询所有数据
all() 查询所有数据
user_queryset = models.User.objects.filter()
'''
or
'''
user_queryset = models.User.objects.all()
增加数据
准备:先写好一个注册的html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h2 class="text-center">注册</h2>
<form action="" method="post">
<p>username:<input type="text" name="username" class="form-control"></p>
{# <p>username:<input type="text" name="username" class="form-control"></p>#}
<p>password:<input type="text" name="password" class="form-control"></p>
{# <p>hobby:#}
{# bbb<input type="checkbox" name="hobby" value="bbb">#}
{# aaa<input type="checkbox" name="hobby" value="aaa">#}
{# ccc<input type="checkbox" name="hobby" value="ccc">#}
{# </p>#}
<input type="submit" class="btn btn-primary ">
</form>
</div>
</div>
</div>
</body>
</html>
register.html
方法1、create()
def reg(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
#直接朝数据库中添加数据
user_obj = models.User.objects.create(name=username,password=password)
print(user_obj,user_obj.name)
return render(request,'register.html')
方法2、对象的绑定方法
#1 先生成一个User对象
user_obj = models.User(name=username, password=password)
#2 调用对象的绑定方法
user_obj.save()
删除数据
准备一个用户展示页home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
{# <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">数据展示</h1>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
<th>operation</th>
</tr>
</thead>
<tbody>
{% for user_obj in res %} <!--[user_obj1,user_obj2...]-->
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.name }}</td>
<td>{{ user_obj.password }}</td>
<td>
<a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
<a href="/delete_user/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %} </tbody>
</table> </div>
</div>
</div>
</body>
</html>
home.html
models.User.objects.filter(id=1).delete() # 将filter过滤出来的数据全部删除 批量删除
见如下详情:
def del_user(request):
# 获取用户想要删除的数据id
delete_id = request.GET.get('delete_id')
# 直接根据id删除数据
models.User.objects.filter(id=delete_id).delete() #将filter过滤出来的数据全部删除
#重定向到展示页
return redirect('/home')
修改数据
# 方式一(推荐) 批量更新
models.User.objects.filter(id=1).update(name=username,password=password)
# 方式二(了解)
# 1.先获取数据对象
edit_obj = models.User.objects.filter(id=1).first()
# 2.再修改对象属性
edit_obj.name = username
edit_obj.password = password
# 3.调用对象的绑定方法保存
edit_obj.save()
见如下详情:
def edit_user(request):
#获取用户想要修改的数据id值
edit_id = request.GET.get('edit_id')
if request.method == 'POST':
#获取用户修改之后的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 修改数据
# 方式一
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 方式二
# 1.先获取数据对象
edit_obj =models.User.objects.filter(id=edit_id).first()
# 2.再修改对象属性
edit_obj.name = username
edit_obj.password = password
# 3.调用对象的绑定方法保存
edit_obj.save()
#再次跳转到数据展示页
return redirect('/home')
#根据id获取数据对象,并且展示到html页面上
edit_obj = models.User.objects.filter(id=edit_id).first()
return render(request,'edit_user.html',{'edit_obj':edit_obj})
Django request对象与ORM简介的更多相关文章
- python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)
昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
- 8 Django 模型层(1)--orm简介
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- django基础知识之ORM简介:
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...
- Python - Django - request 对象
request.method: 获取请求的方法,例如 GET.POST 等 views.py: from django.shortcuts import render, HttpResponse # ...
- django request对象和HttpResponse对象
HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外)HttpRequest.scheme 请求方案(通常为http或https)HttpRequest.body 字 ...
- django总结 --》内容(django建project开始的大致流程、ORM简介)
1 安装: pip install django==1.11.9 另外:在pycharm中安装 django,在下图中七步走 2. 新建Django项目 django-admin startpro ...
- python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)
12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
随机推荐
- 《高性能MySQL》之MySQL查询性能优化
为什么查询会慢? 响应时间过长.如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数, ...
- ios--->NSNotificationCenter传值
object实现 //在发送通知时设置object参数 [[NSNotificationCenter defaultCenter] postNotificationName:@"ThisIs ...
- codeforces 1278F - Cards(第二类斯特林数+二项式)
传送门 解题过程: \(答案=\sum^n_{i=0}*C^i_n*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}*i^k\) 根据第二类斯特林数的性质\(n^k=\sum ...
- 简单看看读写锁ReentantReadWriteLock
前面我们看了可重入锁ReentrantLock,其实这个锁只适用于写多读少的情况,就是多个线程去修改一个数据的时候,适合用这个锁,但是如果多个线程都去读一个数据,还用这个锁的话会降低效率,因为同一时刻 ...
- k3s首季在线培训来袭!本周四晚,线上见!
筹备已久的k3s在线培训终于要和大家见面啦! k3s是一款适用于边缘计算场景以及IoT场景的轻量级Kubernetes发行版,经过CNCF的一致性认证.由业界应用最广泛的Kubernetes管理平台R ...
- winsocket入门学习
参考资料:http://c.biancheng.net/cpp/socket/ http://www.winsocketdotnetworkprogramming.com/ socket 是" ...
- winform应用如何发布(不用打包)、并提醒用户自动更新
环境:VS2019 community C# winform 应用程序 设计应用程序界面 编写对应代码 使用PS设计程序标识ICON F4打开属性: 设置ICON 设置背景 打开项目属性 打开“发 ...
- 详解python的装饰器decorator
装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...
- 快速理解YOLO目标检测
YOLO(You Only Look Once)论文 近些年,R-CNN等基于深度学习目标检测方法,大大提高了检测精度和检测速度. 例如在Pascal VOC数据集上Faster R-CNN的mAP达 ...
- 使用Java实现三个线程交替打印0-74
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...