模版语法分配变量

在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端的更多相关文章

  1. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  2. django -- ORM实现作者增删改查

    前戏 前面我们已经实现了出版社的增删改查,书的增删改查,书和出版社的对应关系.现在来写一下作者的增删改查和书的对应关系,那书和作者有什么关系呢?一个作者可以写多本书,一本书可以有多个作者,所以书和作者 ...

  3. django -- ORM实现图书增删改查

    表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...

  4. django -- ORM实现出版社增删改查

    前戏 我们来完成一个图书管理系统的增删改查 表结构设计 1. 出版社 id   name 2. 作者 id  name 3. 书 id  title  出版社_id 4. 作者_书_关系表 id  书 ...

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

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

  6. mysql对库,表及记录的增删改查

    破解密码 #1.关闭mysqlnet stop mysqlmysql还在运行时需要输入命令关闭,也可以手动去服务关闭 #2.重新启动mysqld --skip-grant-tables跳过权限 #3m ...

  7. ORM多表增删改查

    一 创建多表 在models.py里创建4张表:Author(作者).AuthorDetail(作者详细信息).Publish(出版社).Book(书) 四张表关系为: (1)首先创建一对一关系.On ...

  8. 使用轻量级ORM Dapper进行增删改查

      项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...

  9. Django之数据表增删改查

    Django数据增删改查: 上课代码 from django.shortcuts import render,HttpResponse # Create your views here. from a ...

随机推荐

  1. IDEA+Hadoop2.10.1+Zookeeper3.4.10+Hbase 2.3.5 操作JavaAPI

    在此之前要配置好三节点的hadoop集群,zookeeper集群,并启动它们,然后再配置好HBase环境 本文只是HBase2.3.5API操作作相应说明,如果前面环境还没有配置好,可以翻看我之前的博 ...

  2. CF1539A Contest Start[题解]

    Contest Start 题目大意 有 \(n\) 个人报名参加一个比赛,从 \(0\) 时刻开始每隔 \(x\) 分钟有一个人开始比赛,每个人参赛时间相同,均为 \(t\) .定义一个选手的不满意 ...

  3. 从零搭建一个IdentityServer——资源与访问控制

    IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...

  4. mysql实现主从复制、读写分离的配置方法(一)

    1. 测试环境 两个CentOS7虚拟机 mysql 5.5-MariaDB master_ip:192.168.1.109 slave_ip:192.168.1.118 2. 配置主服务器 2.1  ...

  5. mybatis的增删改查返回值小析(六)

    本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...

  6. 如何让py生成pyd

    pyd文件类似于C++中的dll,可以编译,但是看不到源代码. py转换成pyd参考链接:https://blog.csdn.net/weixin_44493841/article/details/1 ...

  7. 前后端数据交互利器--Protobuf

    Protobuf 介绍 Protocol Buffers(又名 protobuf)是 Google 的语言中立.平台中立.可扩展的结构化数据序列化机制. https://github.com/prot ...

  8. jvm源码解读--16 锁_开头

    现在不太清楚, public static void main(String[] args) { Object object=new Object(); System.out.println(&quo ...

  9. intouch与PLC之间通讯状态监测和设置

    intouch与PLC进行通讯状态监测中,一般做法需要PLC来实施主动脉冲计数,或者bool变化来实现.本文通过上位机自带参数设置,实现对intouch通讯状态监视,将画面恢复初始状态,并及时弹窗报警 ...

  10. MySQL 优化【转】

    MySQL常见的优化手段分为下面几个方面: SQL优化.设计优化,硬件优化等,其中每个大的方向中又包含多个小的优化点 下面我们具体来看看~ SQL优化 此优化方案指的是通过优化 SQL 语句以及索引来 ...