Django學習4:URL傳參

目錄

 

一、視圖函數

二、URL傳參

方法1.在url中使用參數

方法2.查詢字符串方式使url傳參

三、URL參數轉換器

四、URL分層模塊化

五、URL的命名 

 六、應用命名空間、實例命名空間


一、視圖函數

視圖函數:

1.第一個函數的參數必須是request

2.視圖函數的返回值必須是HTTPResponseBase的及其子類

 

二、URL傳參

方法1.在url中使用參數

首先需要在視圖函數的參數中寫明要傳遞的參數,比如在play應用中的views.py寫一個playing函數,需要傳遞歌曲id和種類id

def playing(request,song_id,category_id):
    text = "您播放的歌曲id是:%s ,歌曲種類id:%s" % (song_id,category_id)
    return HttpResponse(text)

然後在項目firstproject裏的urls.py中寫一個url,paly是應用名,playing是函數名,然後將視圖函數的參數複製到<>裏邊

path('play/playing/<song_id>/<category_id>/', views.playing),

在訪問時,需要按照 定義的url的格式傳入參數,如果有參數個數不對等問題,都會出不來結果

方法2.查詢字符串方式使url傳參

如下圖,大多數查詢都使用這種查詢字符串的方式,?後邊即爲查詢的內容,

此種方法不需要在視圖函數中逐一匹配參數,只需寫明GET請求傳遞的參數,下面的id即是查詢時?id=“查詢的內容”

def singer_detail(request):
    singer_id = request.GET.get('id')
    text = '歌手的id是:%s' % singer_id
    return HttpResponse(text)

 在項目的urls裏,定義的play即爲應用play的名稱,singer_id即爲查詢之前匹配的字符,也可以改成別的,比如singer,只要在訪問的時候和這個定義的url一致就可以

 path('play/singer_id/', views.singer_detail),

三、URL參數轉換器

  1. str:除了'/'之外都可以
  2. int:只有一個或多個阿拉伯數字纔可以
  3. path:所有字符都可以
  4. UUID:只有滿足'uuid.uuid4()'這個函數返回的 字符串才滿足
  5. slug:英文中的-或者英文字符、阿拉伯數字或者下劃線才滿足

比如限制歌曲id爲阿拉伯數字,種類id是字符

 path('play/playing/<int:song_id>/<str:category_id>/', views.playing),

如果song_id不是阿拉伯數字,就會報錯

四、URL分層模塊化

當頁面太多,有太多個關於不同內容的url在項目firstproject中的url定義時就會容易太亂,可以根據不同的內容,比如所有關於播放play這個模塊的url可以放在應用play的urls.py裏,模塊化操作如下:

步驟1. 在應用play中新建urls.py,寫入如下代碼:不同於項目中的urls.py裏的定義,在此處定義的url默認是從play開始path('',views.play),是指path('play',views.play)。其他的沒有區別

from django.urls import path
from . import views
urlpatterns = [
    path('', views.play),
    # path('play/playing/<int:song_id>/<str:category_id>/', views.playing),
    path('playing/<int:song_id>/<str:category_id>/', views.playing),
    path('singer/', views.singer_detail),
]

步驟2:而在項目的urls.py中,導入include的引用,然後在url定義中前半部分是應用play的url中省下的部分,後半部分加入include(),include裏邊是導入的應用play裏的urls,這裏是項目的urls和play的urls進行了拼接

from django.urls import path,include
from play import views
from django.http import HttpResponse

urlpatterns = [
    path('admin/', admin.site.urls),
    path('play/', include('play.urls')),
]

五、URL的命名 

1.爲什麼要命名?

比如在做跳轉時,會經常修改url,而此時已經有多處都用到url,所以如果給url一個命名,在views.py文件中使用的是url的命名,只需要翻轉一下,就可以找到在urls.py中定義的原來的url,如果想要修改url,也只需要去urls.py中修改一處即可

2.如何命名?

比如在user的urls.py中,只需在path中加一個name參數

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login, name='signin'),
]

在views.py中的視圖函數使用時,可以將url的命名用reversed反轉一下,然後代替原來的url寫入跳轉函數中,如下:

from django.http import HttpResponse
from django.shortcuts import redirect

def index(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse("用戶中心")
    else:
        login_url = reversed('signin')
        return redirect(login_url)
        #return redirect('/user/login/')


def login(request):
    return HttpResponse("登錄頁面")

 六、應用命名空間、實例命名空間

  • 爲什麼要用應用命名空間?

在做反轉時,reverse('urlname')會根據擁有此url名字的url進行解析,但是如果多個應用有相同的url名稱,那麼可能出來的是別的應用的頁面,所以應用命名空間,app_name是應用命名空間的參數,比如user的urls.py中代碼如下:

from django.urls import path
from . import views

#應用命名空間的變量叫做app_name
app_name = 'user'
urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login, name='signin'),
]
  • 爲什麼要用實例命名空間呢?

同一個app可以使用不同的url進行映射,即同一個app下可以有多個實例,而用應用命名空間做反轉的時候,就會發生混淆,所以實例名命名空間>應用命名空間,而且必須有應用命名空間,才能使用實例命名空間。代碼如下:

在項目的urls.py裏,namespace爲實例名命的參數

    path('user1/', include('user.urls', namespace='user1')),
    path('user2/', include('user.urls', namespace='user2')),

在應用user的urls.py裏的視圖函數中利用request.resolver_match.namespace 獲取實例命名空間

current_namespace = request.resolver_match.namespace
return redirect(reversed("%s:login"%current_namespace))

 

視頻課:https://www.bilibili.com/video/av93363026?p=34

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章