django-路由层详解
可视化界面之数据增删改查
针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取
在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看
'''
form表单中能够触发调剂动作的按钮只有两个
<input type='submit'/>
<button></button>
'''
1.数据展示功能
开设接口、获取数据、传递页面、展示数据
2.数据添加功能
开设接口、获取数据、发送数据、校验数据、录入数据、重定向
3.数据编辑功能
开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新
4.数据删除功能
开设接口、问号携带参数、删除二次确认
django请求生命周期流程图
django路由层
-
路由匹配
django2.x及以上 path第一个参数写什么就匹配什么
django1.x第一个参数是正则表达式
无论什么版本django都自带加斜杠后缀的功能 也可以取消在settings.py配置文件中 APPEND_SLASH = False
下面是关闭这个配置的截图
! -
转换器
正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合适
django2.x及以上版本路由动态匹配有转换器(五种)- str:匹配除路径分隔符外的任何非空字符串
- int:匹配0或任意正整数
- slug:匹配任意一个由字母或数字组成的字符串
- uuid:匹配格式化后的UUID
- path:能够匹配完整的URL路径
还支持自定义转换器(自己写正则表达式匹配更加细化的内容)
#路由层urls.py path('test/<str:info>/', views.test_func), #视图层views.py def test_func(request, info): return HttpResponse(info) index_func(实参request对象,info='转换器匹配到的类型转换之后的内容') path('index/<str:info>/<int:id>/', views.index_func) # index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容')
-
正则匹配
django2.x及以上版本有re_path 第一个参数是正则
匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功立即停止路由层其它的匹配直接执行对应的视图函数#路由层urls.py re_path('^update/$/',views.update_func,),
django1.x正则路由匹配使用的是url()功能与django2.x及以上的re_path()一致
-
正则匹配的无名有名分组
-
无名分组
会将括号内正则匹配到的内容当做位置参数传递给视图函数#路由层urls.py re_path('^test/(\d{4})/', views.test) #视图层views.py def test_func(request, aaa): return HttpResponse(aaa)
-
有名分组
会将括号内正则匹配到的内容当作关键字参数传递给视图函数#路由层urls.py re_path('^delete/(?P<id>\d*?)/',views.delete_func), #视图层views.py def delete_func(request): return redirect('/update/')
-
注意上述的分组不能混合使用!!!
-
反向解析
通过一个名字可以反向解析除一个结果 该结果可以访问到某个对应的路由
基本使用
-
路由匹配关系起别名
#路由层urls.py path('^delete/',views.delete_func,name = 'delete_func'),
-
反向解析语法
-
后端语法
#视图层views.py def delete_func(request): return redirect(reverse('index_func'))
-
html页面模板语法
templates文件下的静态html文件 <a href="{% url 'delete_func' %}" class="btn btn-danger">删除</a>
-
-
动态路由的反向解析
后端语法re_path('^delete/(?P<id>\d*?)/',views.delete_func,name = 'delete_func'),
html页面模板语法
<a href="{% url 'delete_func' all_user.pk %}" class="btn btn-danger">删除</a>
django小案例
urls.py
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<id>\d{0,9})/',views.update_func,name = 'update_func'),
re_path('^delete/(?P<id>\d{0,9})/',views.delete_func,name = 'delete_func'),
path('test/<str:info>/', views.test_func),
]
"""
注释要卸载外面不能写在里面
"""
views.py
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.4.1/css/bootstrap.css">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
{% load static %}
<script src="{% static 'jQuery3.16/jQuery.main.3.16.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="h1 text-center btn-block">用户信息</h1>
<a href="{% url 'register_func' %}" class="btn btn-info">添加用户</a>
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>PWD</th>
<th>AGE</th>
<th>operations</th>
</tr>
</thead>
<tbody>
{% for all_user in all_user_list %}
<tr>
<td>{{ all_user.pk }}</td>
<td>{{ all_user.name }}</td>
<td>{{ all_user.pwd }}</td>
<td>{{ all_user.age }}</td>
<td><a href="{% url 'update_func' all_user.pk %}" class="btn btn-info">修改</a>
<a href="{% url 'delete_func' all_user.pk %}" class="btn btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.4.1/css/bootstrap.css">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style>
input {
margin: 10px auto;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="h1 text-center btn-block">用户信息</h1>
<form action="#" method="post" >
{% csrf_token %}
<input type="text" class="form-control" name="name" placeholder="请输入用户名">
<input type="password" class="form-control" name="pwd" placeholder="请输入密码">
<input type="text" class="form-control" name="age" placeholder="请输入年龄">
<input type="submit" class="form-control btn-success" value="注册">
</form>
</div>
</div>
</div>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.4.1/css/bootstrap.css">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style>
input {
margin: 10px auto;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="h1 text-center btn-block">用户信息</h1>
<form action="" method="post">
{% csrf_token %}
<input type="text" class="form-control" name="name" placeholder="请输入用户名"
value="{{ user_date_list.name }}">
<input type="text" class="form-control" name="pwd" placeholder="请输入密码" value="{{ user_date_list.pwd }}">
<input type="text" class="form-control" name="age" placeholder="请输入年龄" value="{{ user_date_list.age }}" >
<input type="submit" class="form-control btn-success" value="修改">
</form>
</div>
</div>
</div>
</body>
</html>
标签:name,views,request,django,详解,user,func,path,路由
From: https://www.cnblogs.com/clever-cat/p/16977135.html