Django ORM记录的增删改查结合web端
模版语法分配变量
在views.py文件中定义一个视图函数show_data:
def show_data(request):
# 定义一个字典 并将它展示在前端HTML文件
user_dic = {'name': 'jesse', 'age': '18'}
return render(request, 'show_data.html', {'user_dic': user_dic})
在templates文件夹内创建show_data.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>展示数据</title>
</head>
<body>
<H1>GET DATA!</H1>
<p>{{ user_dic }}</p>
<p>{{ user_dic.age }}</p>
<p>{{ user_dic.name }}</p>
</body>
</html>
用{ {user_dic} }就可以在html页面将视图函数内定义的字典展示出来了,传过去的是字典可以.key将values取出来,如果是列表可以.index
将列表中的值取出。需要注意的是,html里面的user_dic是视图函数内的key值。
如果需要传到前端的数据过多可以使用locals语法,将函数内所有的局部变量传过去:
return render(request, 'show_data.html', locals())
# 前端模版语法都是一样的 双中括号
Django添加记录到表——简易注册功能
首先在models.py建一张user表
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=32)
password = models.IntegerField()
写好html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
<style>
#d1{
height: 106px;
width: 100%;
color: rgb(90,159,213);
}
</style>
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<div id="d1"></div>
<h1 class="text-center">注册</h1>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<form action="" method="post">
<p><input type="text" placeholder="用户名" name="username" class="form-control"></p>
<p><input type="password" placeholder="密码(区分大小写)" name="password" class="form-control"></p>
<input type="submit" value="注册" class="btn btn-success btn-block">
</form>
</div>
</div>
</div>
</body>
</html>
register视图函数:
from app_user import models
# 这里因为要通过操作models.py里面的User类所以要导入
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 入库操作,指定表名User
models.User.objects.create(username=username, password=password) # 写入操作 前面的username是字段名
return redirect('/login/')
return render(request, 'register.html')
Django查询数据——展示数据到页面
首先在views.py定义一个视图函数:
def edit_user(request):
user_list = models.User.objects.all()
print(user_list)
"""
user_list得到的是一个对象列表
<QuerySet [<User: User object>, <User: User object>, <User: User object>]>
三个对象,就表示有三条记录 在html页面得到它,再for循环,点出里面想要的数据
"""
return render(request, 'edit_user.html', locals())
HTML页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑用户</title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<h1 class="text-center">用户信息表</h1>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_list %}
{# for table出js语法 #}
<tr>
<td>{{ user_obj.id }}</td>
{# 这里面展示后端获取来的数据要加双中括号 #}
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
展示结果:
objects.all()方法和objects.filter()是一样的效果,在filter不加限制条件的时候,filter相当于SQL语句里面的where,起筛选条件,filter括号内的条件如果用逗号隔开,表示的是and关系。
def edit_user(request):
# 筛选出username字段记录为jesse的记录
user_list = models.User.objects.filter(username='jesse').filter(password='123')
# filter返回的是一个对象,所以它可以一直点下去
return render(request, 'edit_user.html', locals())
Django修改数据——在web端修改
在之前的查看HTML页面添加两个a标签,将ID分别代进去
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑用户</title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<h1 class="text-center">用户信息表</h1>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_list %}
{# for table出js语法 #}
<tr>
<td>{{ user_obj.id }}</td>
{# 这里面展示后端获取来的数据要加双中括号 #}
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>
<a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger">删除</a>
{# 这里可以获取到id #}
<a href="/alter_user/?id={{ user_obj.id }}" class= "btn btn-outline-warning">修改</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
在views.py文件内定义视图函数:
ef alter_user(request):
alter_id = request.GET.get('id')
# GET方法得到参数 前面查看页面传过来的id
alter_data = models.User.objects.filter(id=alter_id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
models.User.objects.filter(id=alter_id).update(username=username, password=password)
# update方法可以更新数据
return redirect('/check_user/')
return render(request, 'alter_user.html', locals())
再定义html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改用户信息</title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<h1 class="text-center">修改用户信息表</h1>
<div class="container-fluid" style = 'text-align: center'>
<div class="row">
<div class="col-md-8 col-md-offset-2 div01">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<form action="" method="post">
<td>{{ alter_id }}</td>
<td><input type="text" value="{{ alter_data.username }}" name='username'></td> # 模版语法获取到值
<td><input type="text" value="{{ alter_data.password }}" name='password'></td>
<td><input type="submit" value="保存" class="btn btn-primary"></td>
</form>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
删除数据
删除的方式有两种,物理删除和软删除,物理删除直接有delete方法,软删除我们可以加一个字段,用来标记数据,然后将每删除标记的数据过滤出来。不推荐用物理删除。
# 物理删除
def delete_user(request):
# 获取要删除记录的id
del_id = request.GET.get('id')
models.User.objects.filter(id = del_id).delete()
return redirect('/check_user/')
软删除
先在models.py 文件内添加字段
# 通过添加字段 is_delete
class User(models.Model):
username = models.CharField(max_length=32)
password = models.IntegerField()
is_delete= models.BooleanField(default=0) # 存布尔值,其实存的是0和1 0表示F 1表示T
# 添加完成之后执行迁移命令
python3 manage.py makemigrations
python3 manage.py migrate
# 改变 is_delete 字段的值 标记删除
def delete_user(request):
del_id = request.GET.get('id')
models.User.objects.filter(id=del_id).update(is_delete=True)
return redirect('/check_user/')
这时候为了让查询时被标记记录不显示还应该过滤is_delete=True的记录。
总结:
# 创建记录
models.定义的类名(即表名).objects.create(字段名=记录...)
# 查询记录
models.定义的类名(即表名).objects.all() # 查询所有
# filter中的条件并列关系
models.定义的类名(即表名).objects.filter(筛选条件,筛选条件)
# 升级记录
models.定义的类名(即表名).objects.updata(字段名=new记录)
# 一般更新数据都要进行条件过滤,否则会将该字段所有数据全部更新掉
ORM创建表关系
创建表关系先创建每张表的基础字段,除了关系字段之外的字段先写好。
class Books(models.Model):
title = models.CharField(max_length=32)
# 相当于 price decimal(8,2)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 建立1对多关系,外键在多的一方
publish = models.ForeignKey(to='Publish')
# 默认和另一张表主键关联 如果要和其它字段关联传to_filed=该字段名
# 多对多关系 书与作者
authors = models.ManyToManyField(to='Author')
"""
authors是一个虚拟字段,不会创建,其实它是一个对象
"""
class Publish(models.Model):
publisher_name = models.CharField(max_length=32)
address = models.CharField(max_length=64)
class Author(models.Model):
name = models.CharField(max_length=32)
# 一对一关系 一个作者对应一个作者详情
detail_id = models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model):
phone = models.CharField(max_length=32)
email = models.EmailField() # email varchar(254)
ForeignKey和OneToOneField 会自动在外键字段添加上_id.
总结:
ForeignKey 一对多外键
ManyToManyField 多对多
OneToOneField 一对一
都需要表明to哪张表
Django请求生命周期图
路由介绍
在Django1.x版本urls.py中的路由是正则匹配
url(r'^admin/', admin.site.urls),
# 上尖号表达的是以admin/开头
# Django2.x版本以上用的是:
path 严格匹配写什么就是什么
re_path 等价于1.x版本中的url
# 首页路径写法
url(r'^$', views.home)
Django ORM记录的增删改查结合web端的更多相关文章
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- django -- ORM实现作者增删改查
前戏 前面我们已经实现了出版社的增删改查,书的增删改查,书和出版社的对应关系.现在来写一下作者的增删改查和书的对应关系,那书和作者有什么关系呢?一个作者可以写多本书,一本书可以有多个作者,所以书和作者 ...
- django -- ORM实现图书增删改查
表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...
- django -- ORM实现出版社增删改查
前戏 我们来完成一个图书管理系统的增删改查 表结构设计 1. 出版社 id name 2. 作者 id name 3. 书 id title 出版社_id 4. 作者_书_关系表 id 书 ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
- mysql对库,表及记录的增删改查
破解密码 #1.关闭mysqlnet stop mysqlmysql还在运行时需要输入命令关闭,也可以手动去服务关闭 #2.重新启动mysqld --skip-grant-tables跳过权限 #3m ...
- ORM多表增删改查
一 创建多表 在models.py里创建4张表:Author(作者).AuthorDetail(作者详细信息).Publish(出版社).Book(书) 四张表关系为: (1)首先创建一对一关系.On ...
- 使用轻量级ORM Dapper进行增删改查
项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...
- Django之数据表增删改查
Django数据增删改查: 上课代码 from django.shortcuts import render,HttpResponse # Create your views here. from a ...
随机推荐
- redis集群环境配置
为什么需要集群 redis是一个开源的 key->value 高速存储系统,但是由于redis单线程运行,在系统中,只能利用单核的性能 当redis的调用越来越频繁时,可能会出现redis过于繁 ...
- 使用 redis 减少 秒杀库存 超卖思路 (转)
由于数据库查询的及插入的操作 耗费的实际时间要耗费比redis 要多, 导致 多人查询时库存有,但是实际插入数据库时却超卖 redis 会有效的减少相关的延时,对于并发量相对较少的 可以一用 1 ...
- 我是如何用redis做实时订阅推送的(转)
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中 ...
- Java笔记——方法
1.方法 (1)概念:①解决事情的办法②实现功能的代码段. (2)优点:①提到代码的复用性②便于后期维护. (3)特点:①不调用不执行②方法不能嵌套,定义在类中方法外的位置. (4)定义方 ...
- [WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
1. 什么是AppCenter Visual Studio App Center 是几个常见移动开发和云集成服务(如持续集成.持续交付和自动 UI 测试等服务)的集合. 这些 App Center 服 ...
- 家庭账本开发day07
返回数据问题解决,需要按照规定的json数据进行返回. 利用jsonobejact或者GSON工具将对象ArrayList转化为json 格式.然后response.getWriter().write ...
- win10实现倒计时锁屏,休眠
@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION SET /a s=10+1FOR /l %%i in (1,1,!s!) do ( SET /a s-=1 ...
- windows使用nvm管理node不同版本
最近项目需要升级,新技术需要的node版本较高,而新node不兼容旧版本node,而原项目仍需要继续维护,所以就需要在本地有多个版本的node,基本原理是在环境配置中修改系统变量node的版本文件夹路 ...
- Skywalking-05:在Skywalking RocketBot上添加监控图表
在 Skywalking RocketBot 上添加监控图表 效果图 该图的一些配置信息如下: 标题为: JVM Thread State Count (Java Service) 指标为: read ...
- javascript学习(二)--函数
一.在JavaScript中,定义函数的方式如下: 1.第一种方式: function abs(x) { if (x >= 0) { return x; } else { return -x; ...