前言
提到用户管理之类的,无非就是在数据库增删改查。
假如我们有个表叫web_admin,表结构如下图,我们要对此表增删改查
一、MySQL中增删改查
我们要对web_admin表进行增删改查(最基本的语句)
指定字段增加一个数据,id是自增的
insert into web_admin(username,password) values ('黑猫警长','giao');
不指定字段,但是值类型和数目要和字段的类型和数目匹配
insert into web_admin values ('4','黑猫','black');
删除指定字段
delete from web_admin where id=4;
查找指定字段
select username from web_admin;
更新指定字段
update web_admin set username='小可爱' where id=3;
二、django ORM中对MySQL的增删改查
1.什么是ORM
ORM : 全称 object relational mapping, 对象关系映射
功能 : 通过orm实现使用操作对象的方式来操作数据库中的数据
目的 : 就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
比如我们之前用models中的类创建表,从表中拿出用户名密码和前端数据比较,都是用的orm操作的数据库。
2.获取和创建数据
models.Admin.objects.all() 获取Admin表中的所有数据对象
models.Admin.objects.create(username='露露',password='123') 创建一行数据
在urls.py添加一个路径到函数的映射
path('orm/', views.orm),
views.py中添加orm函数
from django.shortcuts import HttpResponse
from web import models
def orm(request):
# 检索出web_admin表中所有数据
data = models.Admin.objects.all()
# 输出<QuerySet [<Admin: Admin object (1)>, <Admin: Admin object (2)>, <Admin: Admin object (3)>]>
print(data)
return HttpResponse('成功')
然后在网页上访问 http://127.0.0.1:8000/orm/ 命令行就会返回函数中的data值
数据表中只有三条数据,data值是一个QuerySet 中包含了一个列表,列表中就是返回的三条数据对象,直接用"."加数据表字段就可以取到值。
现在我们更改orm函数的内容
from web import models
def orm(request):
# 检索出web_admin表中所有数据
data = models.Admin.objects.all()
for admin in data:
print(admin.username,admin.password)
# 输出数据表中内容
# giao 0000
# jing 1111
# 小可爱 giao
return HttpResponse('成功')
到现在为止只是从数据库中获取值。
3.查找数据
from web import models
def orm(request):
1.查找后依然返回一个QuerySet对象,列表中只有一个查找到的数据对象
data = models.Admin.objects.filter(id=1)
print(data) # <QuerySet [<Admin: Admin object (1)>]>
2.first()函数把列表中的第一个数据对象取出来了
data_first = models.Admin.objects.filter(id=1).first()
print(data_first) # Admin object (1)
3.字段名加__contains查找片段,返回一个QuerySet对象,列表中是所有包含该片段的数据对象
contains = models.Admin.objects.filter(username__contains='可爱')
print(contains) # <QuerySet [<Admin: Admin object (3)>]>
4.判断是否存在
exists = models.Admin.objects.filter(username='小可爱',password='giao').exists()
5.和4相同效果
dict_admin = {
'username':'小可爱',
'password':'giao',
}
exists = models.Admin.objects.filter(**dict_admin).exists()
print(exists) # True
6.排除指定字段后搜索,搜索值为空时相当于all()
exclude = models.Admin.objects.exclude(id=1).filter()
print(exclude) # <QuerySet [<Admin: Admin object (2)>, <Admin: Admin object (3)>]>
return HttpResponse('成功')
4.删除和更新数据
更新数据都是对<QuerySet [<Admin: Admin object (3)>]> 类型的数据进行操作,但是要确保其中列表中只有一条数据对象(对表中不重复的字段进行检索,比如本文中的id),否则你就会更新多个数据。
删除数据对<QuerySet [<Admin: Admin object (3)>]> 和<Admin: Admin object (3)>都可以操作
#所有username更新为露露
models.Admin.objects.filter().update(username='露露')
#id=3的username更新为露露
models.Admin.objects.filter(id=3).update(username='露露')
#会报错 'Admin' object has no attribute 'update'
错误写法: models.Admin.objects.filter(id=3).first().update(username='露露')
#删除所有数据
models.Admin.objects.filter().delete()
#删除id=3的数据
models.Admin.objects.filter(id=3).delete()
#删除username='露露'的所有数据
models.Admin.objects.filter(username='露露').delete()
#删除username='露露'的最靠前的一条数据
models.Admin.objects.filter(username='露露').first().delete()
5.创建用户管理页面
我们直接用web_admin表中的数据来创建用户管理页面。
先说一说思路,我们尽量把各个功能做成单独的页面。
1,页面要显示用户的名字和密码,我们应该创建一个“user/list/”链接来访问,创建一个user_list函数并返回一个user_list.html的页面。
2,应该有添加用户的页面,创建一个“user/add/”链接访问,再创建一个user_add函数并返回一个user_add.html的页面。
3,接着添加一个用户编辑页面,用’user/edit/'链接访问,对应要有一个函数user_edit来返回user_edit.html页面,但是需要提供id
4,用户删除页面其实是不用存在的,点删除时一定会调用一个函数完成删除操作,因此要有对应链接来调用删除函数,也需要提供id。
修改urls.py
edit和delete页面传入的nid其实是用户表中的id,无论编辑和删除都需要一行数据的唯一标识,就是id
from django.contrib import admin
from django.urls import path
from web import views
urlpatterns = [
# path('admin/', admin.site.urls),
path('login/', views.login),
path('image/code/', views.img_code),
path('orm/', views.orm),
#用户管理 添加四个对应数据
path('user/list/',views.user_list),
path('user/add/',views.user_add),
path('user/edit/<int:nid>/',views.user_edit), #传入的nid其实是用户表中的id,无论编辑和删除都需要一行数据的唯一标识,就是id
path('user/delete/<int:nid>/',views.user_delete),
]
修改views.py
# 用户管理
def user_list(request):
# 用orm方式从web_admin表中获取数据
data_list = models.Admin.objects.all()
# 直接把数据返回到user_list.html中
return render(request, 'user_list.html',{'data':data_list})
def user_add(request):
# 请求方式为get,返回添加页面
if request.method == "GET":
return render(request, 'user_add.html')
# 请求方式为post,先获得表单中提交的值
name = request.POST.get('username')
pwd = request.POST.get('password')
# 把获取到的值传到数据库中
models.Admin.objects.create(username=name,password=pwd)
# 重定向到/user/list/,返回user_list.html
return redirect('/user/list/')
def user_edit(request,nid):
# 请求方式为get,返回编辑页面
if request.method == "GET":
return render(request, 'user_edit.html')
# 请求方式为post,先获得表单中提交的值
name = request.POST.get('username')
pwd = request.POST.get('password')
# 获得目标id查找出来的数据并更新
models.Admin.objects.filter(id=nid).update(username=name,password=pwd)
return redirect('/user/list/')
def user_delete(request,nid):
# 拿到id直接删除
models.Admin.objects.filter(id=nid).delete()
return redirect('/user/list/')
添加页面
user_list.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<div>数据列表</div>
<div>
<a href="/user/add/">添加</a>
</div>
<table >
<tbody>
{% for admin in data %}
<tr>
<!-- <th scope="row">1</th> -->
<td>{{admin.id}}</td>
<td>{{admin.username}}</td>
<td>{{admin.password}}</td>
<td>
<a href="/user/edit/{{admin.id}}/">编辑</a>
<a href="/user/delete/{{admin.id}}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
user_add.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<div >添加用户</div>
<div >
<form method="post">
{% csrf_token %}
<div>
<label>用户名</label>
<input name="username">
</div>
<div>
<label>密码</label>
<input name="password">
</div>
<button type="submit">添 加</button>
</form>
</div>
</div>
</body>
</html>
user_edit.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<div >编辑用户</div>
<div >
<form method="post">
{% csrf_token %}
<div>
<label>用户名</label>
<input name="username">
</div>
<div>
<label>密码</label>
<input name="password">
</div>
<button type="submit">编 辑</button>
</form>
</div>
</div>
</body>
</html>
python manage.py runserver 启动网站
运行效果图
总结
由于之前只有一个登录页面,不能进行用户认证的演示,现在写完用户管理页面后可以进行用户认证的添加,访问每个页面都会携带着登录信息。