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简介的更多相关文章

  1. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

  2. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  3. 8 Django 模型层(1)--orm简介

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  4. django基础知识之ORM简介:

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  5. Python - Django - request 对象

    request.method: 获取请求的方法,例如 GET.POST 等 views.py: from django.shortcuts import render, HttpResponse # ...

  6. django request对象和HttpResponse对象

    HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外)HttpRequest.scheme 请求方案(通常为http或https)HttpRequest.body 字 ...

  7. django总结 --》内容(django建project开始的大致流程、ORM简介)

    1 安装: pip  install django==1.11.9 另外:在pycharm中安装 django,在下图中七步走 2. 新建Django项目  django-admin startpro ...

  8. python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)

    12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...

  9. [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]

    [Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...

随机推荐

  1. CentOS7安装docker以及错误解决

    今天在公司电脑上安装docker出现了一些问题,原先是直接用yum安装docker,一次就成功了,由于公司的网络问题导致docker安装完出现了一些问题,客户端启动了,服务端一直启动不了:Job fo ...

  2. qt creator源码全方面分析(2)

    目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 qtcreator.qdocconf qtcreator-dev.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过 ...

  3. 使用RKE快速部署k8s集群

    一.环境准备 1.1环境信息 IP地址 角色 部署软件 10.10.100.5 K8s Master Etcd.Control 10.10.100.17 K8s Worker1 Worker 10.1 ...

  4. 隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 7. 词性标注 7.1 词性标注概述 什么是词性 在语言学上,词性(Par-Of- ...

  5. 二、Shell变量

    类型     注释强变量 变量在使用前,必须事先声明,甚至还需要初始化 弱变量 变量用时声明,甚至不区分类型 变量的作用:用来保存变化的数据 变量名 名称固定,由系统设定或用户定义 变量值 根据用户设 ...

  6. 死磕mysql(6)

    再写数据库作业的时候,发现了一个问题,如果存在主键外键的约束,数据就删不掉 --set foreign_key_checks=0; 关掉外键约束 用好了再打开 --set foreign_key_ch ...

  7. mplayer使用心得[转]

    一直在用mplayer,其他的播放器很少用.以下是我使用过程中的一些心得.  注意,下面用的路径都是在我的电脑上的路径,使用时请不要照抄!应该换成你的电脑上的正确路径.  一.首先还是讲安装方面的问题 ...

  8. CRC循环冗余检测C语言实现----花了几天时间乱写的

    由于笔者目前正在上计算机网络的课,老师要我们编一下crc的循环检测过程,所以我想着刚好在学c,那就随便看看写不写的了,首先百度了一下网上资料,基本都是用位移运算符实现的,由于本人懒得去看一下位移运算, ...

  9. Javascript小白经典题型(二)

    51. 输出的是什么? function getInfo(member, year) { member.name = "Lydia"; year = "1998" ...

  10. 使用PyCharm创建并运行一个Python项目

    (1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...