day03

练习用户管理系统(单表)

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 点击添加用户并查看现象
posted @ 2023-05-09 09:09  也曾滿眼愛意丶  阅读(34)  评论(0)    收藏  举报