1. 程式人生 > 其它 >django-路由層詳解

django-路由層詳解

django-路由層詳解

視覺化介面之資料增刪改查

針對資料物件主鍵欄位的獲取可以使用更加方便的 obj.pk獲取
在模型類中定義雙下str方法可以在資料物件被執行列印操作的時候方便的檢視

'''
form表單中能夠觸發調劑動作的按鈕只有兩個
	<input type='submit'/>
	<button></button>
'''


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路徑

    還支援自定義轉換器(自己寫正則表示式匹配更加細化的內容)

    #路由層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='轉換器匹配到的型別轉換之後的內容')
    
  3. 正則匹配
    django2.x及以上版本有re_path 第一個引數是正則
    匹配的本質是隻要第一個正則表示式能夠從使用者輸入的路由中匹配到資料就算匹配成功立即停止路由層其它的匹配直接執行對應的檢視函式

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

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

  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>