日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django从理论到实战(part15)--自定义path转换器

發布時間:2023/12/19 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django从理论到实战(part15)--自定义path转换器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考

參考自:Django打造大型企業官網;

本系列Blog以應用為主,理論基礎部分我在后端專欄的Django系列博客已經寫過了,如果有些需要補充的知識點,我會在這個系列中,盡量詳細的寫一下。



自定義path轉換器


path轉換器


記得我們以前學習path函數時用的 <int:id>么 ,其中的int就是path轉換器,它的底層實現是這樣的:

class IntConverter:regex = '[0-9]+'def to_python(self, value):return int(value)def to_url(self, value):return str(value)

在這個IntConverter類中它有三個組成部分:

  • 第一部分(regex):正則表達式限制路由規則,在這里,Django規定只能輸入數字;

  • 第二部分(to_python):將得到的路徑按照一定的規則,轉換成統一類型,返回給服務端,在這里,Django將url中得到的str類型參數,轉換為int類型參數傳遞給視圖函數;

  • 第三部分(to_url):在進行url反轉時,視圖函數會將某個形式的數據,轉換為特定形式的參數,并將其傳遞給特定的路由,在這里,Django會將int類型參數轉換為str類型的參數,并將str類型的參數傳遞給特定的路由。

to_python方法相當于做了與to_url方法相反的工作。


自定義path轉換器


現在,我想在url中以書名1+書名2+書名3的方式傳遞參數,并在視圖函數中以列表的形式拿到參數,即[書名1, 書名2, 書名3]


首先,在newwebsite1項目下,我們創建converters.py文件,并該模塊中放我們的自定義path轉換器類:

from django.urls import converters,register_converterclass CategoryConverter(object):regex = r'\w+|(\w+\+\w+)+'def to_python(self,value):# python+django+flask# ['python','django','flask']result = value.split("+")return resultdef to_url(self,value):# value:['python','django','flask']# python+django+flaskif isinstance(value,list):result = "+".join(value)return resultelse:raise RuntimeError("轉換url的時候,分類參數必須為列表!")register_converter(CategoryConverter,'cate') #注冊 #CategoryConverter為自定義path轉換器類 #cate為我們給自定義path轉換器起的類名

那么我們該如何讓這個自定義path轉換器生效呢?

我們知道 __init__.py模塊用于初始化包,即當我們導入某個包時,python就會執行 __init__.py文件,所以,我們可以將converters.py模塊導入到__init__.py模塊中:

from . import converters

當我們導入converters.py模塊時,python就會馬上執行converters.py文件中的代碼,我們的自定義path轉換器就會被注冊。


現在,我們在主urls.py中敲入如下代碼:

from django.contrib import admin from django.urls import path, converters from . import views from django.conf.urls import includeurlpatterns = [path('admin/', admin.site.urls),path('', views.baidu),path('login/', views.login, name = "signin"),path('book/', include('book.urls')),path('cms1/', include('cms.urls', namespace = "cms1")),path('cms2/', include('cms.urls', namespace = "cms2")),path('front/', include('front.urls')),path('test01/<cate:my_books>/', views.test01), ]

views.py中定義視圖函數:

def test01(request, my_books):html = "<h2>我有如下書籍:{}</h2>".format(my_books)return HttpResponse(html)

我們向服務器發起請求:

Very Well !


總結

以上是生活随笔為你收集整理的Django从理论到实战(part15)--自定义path转换器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。