练习用户管理系统(单表)
1.pycharm创建新的Django项目
1.settings.py修改 TEMPLATES中的
'DIRS': [os.path.join(BASE_DIR, 'templates')],
2.注释 MIDDLEWARE中的
'django.middleware.csrf.CsrfViewMiddleware'
3.检查 INSTALLED_APPS中的
app01是否添加
2.打开数据库,手动创建数据库
CREATE DATABASE day57;
3.Django配置数据库连接信息
settings.py中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day57',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
'CHARSET': 'utf8'
}
}
4.配置静态文件
1.手动在Django项目中创建static目录,并放置jquery和bootstrap文件
2. settings.py中配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
5.models.py中创建表
class Userinfo(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
is_delete = models.IntegerField(default=0)
6.数据库迁移
1.pycharm下的终端执行
python3 manage.py makemigrations
python3 manage.py migrate
2.检测数据库是否创建成功
3.手动添加2条数据
INSERT INTO app01_userinfo ( NAME, age, is_delete ) VALUES ( 'jason', 18, 0 ),( 'kevin', 25, 0 );
7.路由层添加函数
urls.py中添加
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
# 用户数据展示
path('userlist/', views.userlist),
]
8.视图层创建函数
views.py中添加
from app01 import models
def userlist(request):
# 查询所有的用户数据,传递给HTML页面展示
# data_queryset = models.Userinfo.objects.all() # 查看所有数据
"""查看字段is_delete为0,没被删除的数据"""
data_queryset = models.Userinfo.objects.filter(is_delete=False).all()
# data_queryset = models.Userinfo.objects.filter() # filter不填参数,相当于没有筛选条件,相当于查询所有
return render(request, 'userlist.html', {'data_queryset': data_queryset})
9.templates创建userlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<a href="" class="btn btn-success btn-xs">添加用户</a>
<table class="table-hover table table-striped">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Age</th>
<th>Operation</th>
</tr>
</thead>
<tobody>
{% for data_obj in data_queryset %}
<tr>
<td>{{ data_obj.id }}</td>
<td>{{ data_obj.name }}</td>
<td>{{ data_obj.age }}</td>
<td>
<a href="" class="btn btn-primary btn-xs">编辑</a>
<a href="" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tobody>
</table>
</div>
</div>
</div>
</body>
</html>
10.启动Django,输入127.0.0.1:8000/userlist 查看现象
添加用户
1.路由层添加函数 urls.py
# 用户数据添加
path('useradd/', views.useradd),
]
2.视图层 views.py
from django.shortcuts import render, HttpResponse, redirect
def useradd(request):
# 2.判断请求方式
if request.method == 'POST':
name = request.POST.get('username')
age = request.POST.get('age')
# 3.先判断用户名是否已存在
user_obj = models.Userinfo.objects.filter(name=name)
if user_obj:
return HttpResponse('用户名已经存在')
# 4.写入数据库
models.Userinfo.objects.create(name=name, age=age, is_delete=0)
# 5.跳转到数据展示页
return redirect('/userlist/')
# 1.先返回一个添加用户数据的页面
return render(request, 'useradd.html')
3.templates创建useradd.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<form action="" method="post">
<p>username:
<input type="text" name="username" class="form-control">
</p>
<p>age:
<input type="text" name="age" class="form-control">
</p>
<input type="submit" class="btn btn-warning" value="添加数据">
</form>
</div>
</div>
</div>
</body>
</html>
4.修改templates中的userlist.html
<h1 class="text-center">数据展示页</h1>
<a href="/useradd/" class="btn btn-success btn-xs">添加用户</a>
"""给添加用户按钮添加链接"""
5.启动Django,输入127.0.0.1:8000/userlist 点击添加用户并查看现象
编辑用户
1.路由层添加函数 urls.py
# 用户数据编辑
path('useredit/', views.useredit),
2.视图层 views.py
def useredit(request):
# 1.获取用户想要编辑的数据
edit_id = request.GET.get('id')
if request.method == 'POST':
name = request.POST.get('username')
age = request.POST.get('age')
# 3.更新数据
"""查询的键是主键,可以用pk,例如pk=edit_id"""
models.Userinfo.objects.filter(id=edit_id).update(name=name, age=age)
# 4.跳转到数据展示页
return redirect('/userlist/')
edit_obj = models.Userinfo.objects.filter(id=edit_id).first()
# 2.返回编辑页面
return render(request, 'useredit.html', {'edit_obj': edit_obj})
3.templates创建useredit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<form action="" method="post">
<p>username:
<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}">
</p>
<p>age:
<input type="text" name="age" class="form-control " value="{{ edit_obj.age }}">
</p>
<input type="submit" class="btn btn-danger" value="编辑数据">
</form>
</div>
</div>
</div>
</body>
</html>
4.修改templates中的userlist.html
<a href="/useredit/?id={{ data_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
"""编辑用户得知道改的是哪个id,所以标签带?id"""
5.启动Django,输入127.0.0.1:8000/userlist 点击编辑并查看现象
删除用户
1.路由层添加函数 urls.py
# 用户数据删除
path('userdel/', views.userdel),
2.视图层 views.py
def userdel(request):
delete_id = request.GET.get('id')
# 把字段 is_delete字段修改成1,表示删除
models.Userinfo.objects.filter(id=delete_id).update(is_delete=True)
# 直接从数据中过删除
# models.Userinfo.objects.filter(id=delete_id).delete()
return redirect('/userlist/')
3.修改templates中的userlist.html
<a href="/userdel/?id={{ data_obj.id }}" class="btn btn-danger btn-xs">删除</a>
4.启动Django,输入127.0.0.1:8000/userlist 点击删除并查看现象
请求生命周期
1.浏览器--->默认基于HTTP协议--->web服务网关接口(Django默认使用wsgiref模块和WSGI协议)
'''wsgiref模块的并发能力非常差,上线之后换成uwsgi
uwsgi模块的并发能力高,配合nginx进行反向代理
'''
2.web服务网关接口作用:请求来的时候拆解数据,响应走的时候封装数据--->Django框架
3.Djang框架:
1.先经过Djang中间件层层筛选
2.urls.py路由层,完成地址的匹配
3.views.py视图层,执行业务逻辑
4.templates文件夹 模板层 HTML页面
5.models.py 模型层 对接数据库
4.模板层和模型层返回的数据,通过模板语法在视图层进行渲染
5.返回到Django中间件,进行校验和打包,最后发回给浏览器
路由匹配
Django2.x以上,路由层urls.py
"""path('网址后缀',函数名)"""
例如:
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('userlist/', views.userlist),
path('useradd/', views.useradd),
path('useredit/', views.useredit),
path('userdel/', views.userdel),
]
"""一旦网址后缀匹配上了,会自动执行后面的函数,并且结束整个路由的匹配"""
1.路由结尾的斜杆'/'
1.默认情况下不写斜杆,Django会做二次处理
第一次匹配不上,会让浏览器加斜杆'/'再次请求
2.settings.py中最后一行添加如下代码,则不会自动加斜杠了
# 控制结尾是否自动加斜杆'/',一般不用,只是知道有这个配置就行
APPEND_SLASH = False
2.path转换器 只在Django2以上才有
当网址后缀不固定的时候,可以使用转换器来匹配
有5种,常用有int和str
str:匹配出路由分隔符“/”之外的所有非空字符串。(默认)
int:匹配0或任何正整数
slug:匹配有字母、数字、连字符和下画线(英文形式)组成的URL,例如http://127.0.0.1:8000/blog/type_blog-django
uuid:为防止多个url映射到同一个页面中,匹配一个uuid。形如59c08be-b828-11e9-a3b8-408d5c7ffd28。
path:匹配任何非空字符串,包括路由分隔符“/” (要与str区分开)
案例:
1.urls.py中添加
path('func/<int:year>/<str:info>', views.func)
# 相当于给func传了year和info,关键字参数;year是int型,info是srt型
2.views.py中定义函数
def func(request, year, info):
print(f'{year}---{info}')
return HttpResponse('hello')
3.浏览器输入 http://127.0.0.1:8000/func/2023/abc
浏览器打印hello;pycharm上打印2023---abc
"""转换器匹配到的内容会当做视图函数的关键字参数传入
转换器有几个,叫什么名字,那么视图函数的形参必须对应
"""
3.re_path 正则匹配
re_path(正则表达式,函数名)
"""一旦网址后缀的正则能够匹配到内容,就会自动执行后面的函数,并结束整个路由匹配"""
案例:
1.urls.py中添加
# 只匹配test
re_path('^test/$', views.test),
# 匹配test/数字,无名分组,会当做位置参数传递给test1
re_path('^test1/(\d+)/', views.test1),
# 匹配test2/数字/任意内容,会当做位置参数传递给test2
re_path('^test2/(\d+)/(.*?)/', views.test2),
# 匹配有名分组,会将year和others变成关键字参数传递给test3
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/',views.test3),
"""Django1.1中,只支持正则匹配,并且方法是 url()
Django2,3,4中,只有path()和 re_path();re_path()等价于url()
"""
2.views.py中定义函数 """函数内接收变量 可以用 *args和**kwargs """
def func(request):
return HttpResponse('hello')
def test1(request,a):
print(a)
return HttpResponse('hello')
def test2(request,a,b):
print(f'{a}---{b}')
return HttpResponse('hello')
def test3(request, year, others):
print(f'{year}---{others}')
return HttpResponse('hello1')
3.浏览器输入 http://127.0.0.1:8000/test对应的,进行校验
反向解析
页面上提前写死了很多路由,一旦路由发生变化,会导致所有页面相关页面链接失效
"""为了防止出现该问题,我们需要使用反向解析"""
案例:
1.url.py添加
path('home/', views.home),
path('reg/', views.reg),
2.views.py添加
def home(request):
return render(request, 'home.html')
def reg(request):
return render(request, 'reg.html')
3.templates创建2个HTML
reg.html的body中添加
<h1>reg页面</h1>
home.html的body中添加
<a href="/reg/">点我去reg哦</a>
<a href="/reg/">点我去reg哦</a>
<a href="/reg/">点我去reg哦</a>
4.浏览器输入 127.0.0.1:8000/home
点击'点我去reg哦'就会跳转到reg页面,但是当修改url.py中的reg为register后,home里页面的reg都要换,不然链接都失效了
"""
反向解析:返回一个结果,该结果可以访问到对应的路由
"""
解决过程:
1.url.py修改
# """路由对应关系起别名"""
path('home/', views.home),
path('reg/', views.reg, name='reg_view'),
2.templates中修改home.html
# """前端使用反向解析语法"""
body中修改
<a href="{% url 'reg_view' %}">点我去reg哦</a>
<a href="{% url 'reg_view' %}">点我去reg哦</a>
<a href="{% url 'reg_view' %}">点我去reg哦</a>
3.views.py中修改home函数
# """后端使用反向解析语法"""
from django.shortcuts import reverse
def home(request):
reverse('reg_view') # 打印的是URL,需要用到的时候用reverse就可以获取
return render(request, 'home.html')
4.浏览器输入 127.0.0.1:8000/home
之后无论url.py中 reg怎么修改,点击'点我去reg哦'都会跳转到reg页面
"""反向解析的操作三个方法都一样,path() re_path() url()"""
无名有名反向解析
案例:
1.url.py修改
path('reg/<str:info>', views.reg), # 不确定的匹配因素
2.views.py修改
def reg(request,*args,**kwargs):
return render(request, 'reg.html')
3.浏览器后缀输入 127.0.0.1:/home/ 会报错,反向解析不到
解决:
1.url.py修改
path('reg/<str:info>', views.reg, name='reg_view'),
2.views.py修改 # 这步骤根据实际情况,有用到就使用reverse
def home(request):
reverse('reg_view', args=('jason',)) # 路由中若有不确定的匹配因素,反向解析需要人为传递数据
return render(request, 'home.html')
2.templates中修改hmoe.html # url中一般使用主键id,下面的'jason'只是案例
<a href="{% url 'reg_view' 'jason' %}">点我去reg哦</a>
<a href="{% url 'reg_view' 'tony' %}">点我去reg哦</a>
<a href="{% url 'reg_view' 'kevin' %}">点我去reg哦</a>
<a href="{% url 'reg_view' '123' %}">点我去reg哦</a>
3.浏览器输入 127.0.0.1:8000/home/ 再打开F12,查看HTML,可以访问a标签里的页面
"""人为添加args中的数据,需要根据实际业务进行人为添加"""
# 如果不确定的匹配因素有2个
1.url.py中 path('reg/<str:info>/<int:year/>', views.reg),
2.views.py中 reverse('reg_view', args=('jason',123)) # 有几个不确定的,就添加几个不确定的
2.templates中修改hmoe.html
<a href="{% url 'reg_view' 'jason' 123 %}">点我去reg哦</a> # 添加2个不确定的
"""多个无名分组,用位置参数"""
3.浏览器输入 127.0.0.1:8000/home/ 再打开F12,查看HTML,可以访问a标签里的页面
"""反向解析的操作三个方法都一样,path() re_path() url()"""
# 案例 有名反向解析
1.url.py中修改
re_path('^reg/(?P<year>\d+)/(?P<month>[0-9]{2})/', views.reg, name='reg_view'),
2.views.py中修改
def home(request):
print(reverse('reg_view', kwargs={'year': 1, 'month': 12}))
return render(request, 'home.html')
2.templates中修改hmoe.html
<a href="{% url 'reg_view' year=1 month=12 %}">点我去reg哦</a> # 添加2个不确定的
"""多个有名用关键字参数"""
3.浏览器输入 127.0.0.1:8000/home/ 再打开F12,查看HTML,可以访问a标签里的页面
路由分发
Django中的应用都可以有自己独立的
urls.py views.py templates文件夹,static文件夹
能够让基于Django开发的多个应用完全独立,便于小组开发
"""
当项目特别大,应用特别多的时候, 可以使用路由分发,非常方便
"""
案例:
1.app01下手动创建urls.py
from django.urls import path, re_path
urlpatterns = [
path('after/',views.after) """子路由"""
]
2.app01下,views.py添加函数
def after(request):
return HttpResponse('下午好,我是app01')
3.Django创建app02
1.django-admin startproject app02
2.settings.py中注册app02
INSTALLED_APPS下添加'app02',
3.app02下手动创建urls.py
from django.urls import path, re_path
urlpatterns = [
path('after/', views.after) """子路由"""
]
4.views.py添加内容
def after(request):
return HttpResponse('下午好,我是app02')
4.Django下的urls.py添加"""总路由"""
# 第一种写法,不正规
from django.urls import include
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
# 第二种写法
from django.urls import include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
path('app01/', include(app01_urls)),
path('app02/', include(app02_urls)),
5.浏览器输入http://127.0.0.1:8000/app01/after/和http://127.0.0.1:8000/app02/after/ 能看到对应的页面
名称空间
案例:
1.app01和app02都修改urls.py
path('after/', views.after, name='after_view')
2.app01和app02都修改views.py,在after函数中添加
print(reverse('after_view'))
3.浏览器访问http://127.0.0.1:8000/app01/after/和http://127.0.0.1:8000/app02/after/
4.pycharm打印的都是/app02/after/
"""有路由分发场景下多个应用在设计到反向解析别名冲突的时候,无法正常解析"""
解决:
方案1:名称空间 # 太麻烦了
1.Django下的urls.py中修改
path('app01/', include((app01_urls, 'app01'), namespace='app01')),
path('app02/', include((app02_urls, 'app02'), namespace='app02')),
2.修改app01和app02的views.py中after函数
print(reverse('app01:after_view'))
print(reverse('app02:after_view'))
3.浏览器访问http://127.0.0.1:8000/app01/after/和http://127.0.0.1:8000/app02/after/
4.pycharm打印的都是各种app的/app01/after/和/app02/after/
方案2:名称空间不要相同 # 最常用的是该方法
1.Django的urls.py改回去
path('app01/', include(app01_urls)),
path('app02/', include(app02_urls)),
2.app01和app02都修改urls.py
path('after/', views.after, name='app01_after_view')
path('after/', views.after, name='app02_after_view')
3.app01和app02都修改views.py,在after函数中修改
print(reverse('app01_after_view'))
print(reverse('app02_after_view'))
4.浏览器访问http://127.0.0.1:8000/app01/after/和http://127.0.0.1:8000/app02/after/
5.pycharm打印的都是各种app的/app01/after/和/app02/after/
"""
保证Django项目的别名不要冲突
"""
练习用户管理系统(使用路由匹配)
准备
1.pycharm创建新的Django项目
1.settings.py修改 TEMPLATES中的
'DIRS': [os.path.join(BASE_DIR, 'templates')],
2.注释 MIDDLEWARE中的
'django.middleware.csrf.CsrfViewMiddleware'
3.检查 INSTALLED_APPS中的
app01是否添加
2.打开数据库,手动创建数据库
CREATE DATABASE day57;
3.Django配置数据库连接信息
settings.py中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day57',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
'CHARSET': 'utf8'
}
}
4.配置静态文件
1.手动在Django项目中创建static目录,并放置jquery和bootstrap文件
2. settings.py中配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
5.models.py中创建表
class Userinfo(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
is_delete = models.IntegerField(default=0)
6.数据库迁移
1.pycharm下的终端执行
python3 manage.py makemigrations
python3 manage.py migrate
2.检测数据库是否创建成功
3.手动添加2条数据
INSERT INTO app01_userinfo ( NAME, age, is_delete ) VALUES ( 'jason', 18, 0 ),( 'kevin', 25, 0 );
展示用户
7.路由层添加函数
urls.py中添加
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('show/', views.show_func, name='show_view'),
]
8.视图层创建函数
views.py中添加
from app01 import models
def show_func(request):
user_dict = models.Userinfo.objects.filter(is_delete=False).all()
return render(request, 'show.html', locals())
# locals()函数会以字典类型返回当前位置的全部局部变量
9.templates创建show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<a href="" class="btn btn-success btn-xs">添加用户</a>
<table class="table-hover table table-striped">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Age</th>
<th>Operation</th>
</tr>
</thead>
<tobody>
{% for data_obj in user_dict %}
<tr>
<td>{{ data_obj.pk }}</td>
<td>{{ data_obj.name }}</td>
<td>{{ data_obj.age }}</td>
<td>
<a href="" class="btn btn-primary btn-xs">编辑用户</a>
<a href="" class="btn btn-danger btn-xs">删除用户</a>
</td>
</tr>
{% endfor %}
</tobody>
</table>
</div>
</div>
</div>
</body>
</html>
10.启动Django,输入127.0.0.1:8000/show 查看现象
添加用户
1.路由层添加函数 urls.py
ath('add/',views.add_func,name='add_view'),
2.视图层 views.py添加函数
from django.shortcuts import render, HttpResponse, redirect, reverse
def add_func(request):
if request.method == 'POST':
name = request.POST.get('username')
age = request.POST.get('age')
if len(name) == 0 or len(age) == 0:
return HttpResponse('名字和年龄不能为空')
models.Userinfo.objects.create(name=name, age=age, is_delete=0)
return redirect(reverse('show_view'))
return render(request, 'register.html')
3.templates创建register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<form action="" method="post">
<p>username:
<input type="text" name="username" class="form-control">
</p>
<p>age:
<input type="text" name="age" class="form-control">
</p>
<input type="submit" class="btn btn-warning" value="添加数据">
</form>
</div>
</div>
</div>
</body>
</html>
4.修改templates中的show.html
<h1 class="text-center">用户数据展示</h1>
<a href="{% url 'add_view' %}" class="btn btn-success btn-xs">添加用户</a>
"""给添加用户按钮添加链接"""
5.启动Django,输入127.0.0.1:8000/show 点击添加用户并查看现象
编辑用户
1.路由层添加函数 urls.py
path('edit/<str:info>', views.edit_func, name='edit_view'),
2.视图层 views.py 添加函数
def edit_func(request, info):
if request.method == 'POST':
name = request.POST.get('username')
age = request.POST.get('age')
models.Userinfo.objects.filter(pk=info).update(name=name, age=age)
# 可以用pk表示主键
return redirect(reverse('show_view'))
user_dict = models.Userinfo.objects.filter(pk=info).first()
return render(request, 'edit.html', locals())
3.templates创建edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-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>
<form action="" method="post">
<p>username:
<input type="text" name="username" class="form-control" value="{{ user_dict.name }}">
</p>
<p>age:
<input type="text" name="age" class="form-control" value="{{ user_dict.age }}">
</p>
<input type="submit" class="btn btn-danger" value="编辑数据">
</form>
</div>
</div>
</div>
</body>
</html>
4.修改templates中的show.html
<a href="{% url 'edit_view' data_obj.pk %}" class="btn btn-primary btn-xs">编辑用户</a>
5.启动Django,输入127.0.0.1:8000/show 点击添加用户并查看现象
删除用户
1.路由层添加函数 urls.py
path('delete/<str:info>', views.edit_func, name='edit_view'),
2.视图层 views.py 添加函数
def delete_func(request, info):
models.Userinfo.objects.filter(pk=info).update(is_delete=True)
return redirect('show_view')
3.修改templates中的show.html
<a href="{% url 'delete_view' data_obj.pk %}" class="btn btn-danger btn-xs">删除用户</a>
4.启动Django,输入127.0.0.1:8000/show 点击添加用户并查看现象