## django-路由层详解 ## 可视化界面之数据增删改查 ```python 针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发调剂动作的按钮只有两个 ''' 1.数据展示功能 开设接口、获取数据、传递页面、展示数据 2.数据添加功能 开设接口、获取数据、发送数据、校验数据、录入数据、重定向 3.数据编辑功能 开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新 4.数据删除功能 开设接口、问号携带参数、删除二次确认 ``` ## django请求生命周期流程图   ## django路由层 1. 路由匹配 django2.x及以上 path第一个参数写什么就匹配什么 django1.x第一个参数是正则表达式 无论什么版本django都自带加斜杠后缀的功能 也可以取消  在settings.py配置文件中 APPEND_SLASH = False 下面是关闭这个配置的截图 ! 2. 转换器 正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合适 django2.x及以上版本路由动态匹配有转换器(五种) - str:匹配除路径分隔符外的任何非空字符串 - int:匹配0或任意正整数 - slug:匹配任意一个由字母或数字组成的字符串 - uuid:匹配格式化后的UUID - path:能够匹配完整的URL路径 还支持自定义转换器(自己写正则表达式匹配更加细化的内容) ```python #路由层urls.py path('test//', views.test_func), #视图层views.py def test_func(request, info): return HttpResponse(info) index_func(实参request对象,info='转换器匹配到的类型转换之后的内容') path('index///', views.index_func) # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容') ```   3. 正则匹配 django2.x及以上版本有re_path 第一个参数是正则 匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功立即停止路由层其它的匹配直接执行对应的视图函数 ```python #路由层urls.py re_path('^update/$/',views.update_func,), ``` django1.x正则路由匹配使用的是url()功能与django2.x及以上的re_path()一致  4. 正则匹配的无名有名分组 - 无名分组 会将括号内正则匹配到的内容当做位置参数传递给视图函数 ```python #路由层urls.py re_path('^test/(\d{4})/', views.test) #视图层views.py def test_func(request, aaa): return HttpResponse(aaa) ``` - 有名分组 会将括号内正则匹配到的内容当作关键字参数传递给视图函数 ```python #路由层urls.py re_path('^delete/(?P\d*?)/',views.delete_func), #视图层views.py def delete_func(request): return redirect('/update/') ``` - 注意上述的分组不能混合使用!!! ## 反向解析 通过一个名字可以反向解析除一个结果 该结果可以访问到某个对应的路由 基本使用 1. 路由匹配关系起别名 ```python #路由层urls.py path('^delete/',views.delete_func,name = 'delete_func'), ``` 2. 反向解析语法 - 后端语法 ```python #视图层views.py def delete_func(request): return redirect(reverse('index_func')) ``` - html页面模板语法 ```python templates文件下的静态html文件 删除 ``` 3. 动态路由的反向解析 后端语法 ```python re_path('^delete/(?P\d*?)/',views.delete_func,name = 'delete_func'), ``` html页面模板语法 ```python 删除 ``` ## django小案例 urls.py ```python from django.contrib import admin from django.urls import path,re_path from user import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index_func,name='index_func'), path('', views.index_func), path('register/', views.register_func, name='register_func'), # path('update/', views.update_func), # path('delete/', views.delete_func), re_path('^update/(?P\d{0,9})/',views.update_func,name = 'update_func'), re_path('^delete/(?P\d{0,9})/',views.delete_func,name = 'delete_func'), path('test//', views.test_func), ] """ 注释要卸载外面不能写在里面 """ ``` views.py ```python from django.shortcuts import render, HttpResponse, redirect, reverse from user.models import User # Create your views here. def index_func(request): user_obj_list = User.objects.filter() return render(request, 'user_table.html', {'all_user_list': user_obj_list}) def register_func(request): if request.method == 'POST': name = request.POST.get('name') pwd = request.POST.get('pwd') age = request.POST.get('age') try: age = int(age) except BaseException as e: return HttpResponse('非法数据,年龄只能为整数') if not name or not pwd or not age: return HttpResponse('非法数据,数据为空') user_obj_list = User.objects.filter(name=name) if user_obj_list: return HttpResponse('用户名已存在') User.objects.create(name=name, pwd=pwd, age=age) return redirect(reverse('index_func')) return render(request, 'register.html') def update_func(request, id): print(reverse('update_func',args=(id,))) # 动态后端反向解析 if request.method == 'POST': name = request.POST.get('name') name = str(name) pwd = request.POST.get('pwd') age = request.POST.get('age') try: age = int(age) except BaseException as e: return HttpResponse('非法数据,年龄只能为整数') if not name or not pwd or not age: return HttpResponse('非法数据,数据为空') user_obj_list = User.objects.filter(pk=id).update(name=name, pwd=pwd, age=age) # print(user_obj_list) # if not user_obj_list: # return HttpResponse('用户不存在') return redirect(reverse('index_func')) user_obj_list = User.objects.filter(pk=id) if not user_obj_list: return HttpResponse('用户不存在') return render(request, 'update.html', {'user_date_list': user_obj_list[0]}) def delete_func(request, id): User.objects.filter(pk=id).delete() return redirect(reverse('index_func')) def test_func(request, aaa): return HttpResponse(aaa) ``` user_table.html ```python Title {% load static %} 用户信息 添加用户 ID NAME PWD AGE operations {% for all_user in all_user_list %} {{ all_user.pk }} {{ all_user.name }} {{ all_user.pwd }} {{ all_user.age }} 修改 删除 {% endfor %} ``` register.html ```python Title 用户信息 {% csrf_token %} ``` update.html ```python Title 用户信息 {% csrf_token %} ``` Last modification:December 12th, 2022 at 09:24 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments
Comment here is closed