首页 > 其他分享 >django-路由层详解

django-路由层详解

时间:2022-12-12 21:34:53浏览次数:56  
标签:name views request django 详解 user func path 路由

django-路由层详解

可视化界面之数据增删改查

针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取
在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看

'''
form表单中能够触发调剂动作的按钮只有两个
	<input type='submit'/>
	<button></button>
'''


1.数据展示功能
	开设接口、获取数据、传递页面、展示数据
2.数据添加功能
	开设接口、获取数据、发送数据、校验数据、录入数据、重定向
3.数据编辑功能
	开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新
4.数据删除功能
	开设接口、问号携带参数、删除二次确认

django请求生命周期流程图

image

image

django路由层

  1. 路由匹配
    django2.x及以上 path第一个参数写什么就匹配什么
    django1.x第一个参数是正则表达式
    无论什么版本django都自带加斜杠后缀的功能 也可以取消

    image

    在settings.py配置文件中 APPEND_SLASH = False

    下面是关闭这个配置的截图
    !image

  2. 转换器
    正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合适
    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='转换器匹配到的类型转换之后的内容')
    

    image

    image

  3. 正则匹配
    django2.x及以上版本有re_path 第一个参数是正则
    匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功立即停止路由层其它的匹配直接执行对应的视图函数

    #路由层urls.py
    re_path('^update/$/',views.update_func,),
    
    

    django1.x正则路由匹配使用的是url()功能与django2.x及以上的re_path()一致
    image

  4. 正则匹配的无名有名分组

    • 无名分组
      会将括号内正则匹配到的内容当做位置参数传递给视图函数

      #路由层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/')
      
    • 注意上述的分组不能混合使用!!!

反向解析

通过一个名字可以反向解析除一个结果 该结果可以访问到某个对应的路由

基本使用

  1. 路由匹配关系起别名

    #路由层urls.py
    path('^delete/',views.delete_func,name = 'delete_func'),
    
  2. 反向解析语法

    • 后端语法

      #视图层views.py
      def delete_func(request):
          return redirect(reverse('index_func'))
      
    • html页面模板语法

      templates文件下的静态html文件
                                  <a href="{% url 'delete_func' %}" class="btn btn-danger">删除</a>
      
  3. 动态路由的反向解析
    后端语法

    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>&nbsp;
                            <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

相关文章

  • Django框架:路由层
    目录Django中的路由层一、可视化界面之增删改查1.数据展示2.数据的添加功能3.数据的编辑功能4.数据的删除功能二、Django请求生命周期流程图1.web服务网关接口2.整个Django......
  • GLES3.0中文API-glGetActiveUniform详解
    前言     glGetActiveUniform()函数看了官方的解释,也看了别人的一些帖子,但是基本上都没有实际的代码,没有实操总觉得隔了一层,雾里看花理解不了。下面亲自写段代码验......
  • 可视化界面之数据增删改查、django请求生命周期流程图、django路由层、反向解析
    可视化界面之数据增删改查针对数据对象主键字段的获取可以使用更加方便的obj.pk获取在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看'''for......
  • Django3
    django请求生命周期流程图1.Django请求的生命周期的含义Django请求的生命周期是指:当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。2.Dj......
  • RFO SIG:openEuler AWS AMI 制作详解
    作者简介王瀚兴,SUSE软件工程师,主要负责Rancher产品线相关的研发工作。欧拉开源社区的RFOSIG正在努力将openEuler与Rancher整合,以推动社区的云原生版图发展。而op......
  • django路由层知识
    今日内容概要作业讲解(数据增删改查)django请求生命周期流程图django路由层python虚拟环境(跳过)反向解析路由分发名称空间今日内容详细可视化界面之数据增......
  • django路由层
    上周内容回顾静态文件及相关配置1.静态文件的概念 简单的理解为html页面需要使用到的不经常变化的资源 css文件、js文件、img文件、第三方文件2.静态文件配......
  • Django路由层的匹配
    前日内容回顾静态文件的配置页面中不需要经常修改的内容(样式、脚本、图片等)采用静态文件的方式保存,需要在Django的配置文件中注册相应的文件地址。request对象方......
  • 可视化界面之数据增删改查、django请求生命周期流程图、django路由层、反向解析、
    目录可视化界面之数据增删改查django请求生命周期流程图django路由层反向解析可视化界面之数据增删改查针对数据对象主键字段的获取可以使用更加方便的obj.pk获取在模......
  • C语言操作符详解
    操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用,函数调用和结构成员算术操作符(+-*/%)1.除了%操作符......