django額外參數的傳遞
path方法:path(route, view, kwargs=None, name=None)
- path方法可以傳遞入一個額外參數的字典參數(kwarg),字典里的值就會被傳給視圖函數。
- 傳入的字典里的key必須在視圖函數的參數里,否則會報錯。
- 當字典參數里的key和url捕獲的參數一致時,以額外參數(kwargs)里的為准。
1 from django.urls import path 2 from .views import * 3 4 urlpatterns = [ 5 path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}), 6 ]
傳入額外參數
1 from django.shortcuts import render, HttpResponse 2 3 # Create your views here. 4 5 6 def index(request, pk, id): 7 return HttpResponse('你輸入的參數是pk:{}-id:{}'.format(pk, id))
視圖函數
返回結果中輸入的pk參數是5,但是默認的kwargs里是20,最終以額外參數里的為准。
url命名
path方法里面最后還有個name參數,默認為None,現在有以下場景:
- 當訪問莫一頁面時,需要跳轉到另一頁面
from django.shortcuts import render, HttpResponse, redirect # Create your views here. def index(request, pk, id): return HttpResponse('你輸入的參數是pk:{}-id:{}'.format(pk, id)) def show_info(request): return HttpResponse('<h1>hello world</h1>') def login(request): return redirect('/teacher/info')
視圖函數
1 from django.urls import path 2 from .views import * 3 4 urlpatterns = [ 5 path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}), 6 path('info/', show_info), 7 path('login/', login), 8 ]
路由配置
- 利用django的redirect方法實現頁面的跳轉,redirect里面傳入一個路徑的字符串。
- 當訪問login的時候,直接給跳轉到了info頁面。
- 假設以后info頁面的路徑發生了改變,當有很多頁面都跳向該頁面的時候,人為的手動去修改redirect里面的路徑會很麻煩。這時候就要用到django的path方法提供的name參數了。
1 from django.shortcuts import render, HttpResponse, redirect, reverse 2 3 # Create your views here. 4 5 6 def index(request, pk, id): 7 return HttpResponse('你輸入的參數是pk:{}-id:{}'.format(pk, id)) 8 9 10 def show_info(request): 11 return HttpResponse('<h1>hello world</h1>') 12 13 14 def login(request): 15 url = reverse('info') 16 return redirect(url)
1 from django.urls import path 2 from .views import * 3 4 urlpatterns = [ 5 path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}), 6 path('info/', show_info, name='info'), 7 path('login/', login), 8 ]
- 首先在需要跳轉的頁面的path方法里面,給該路由命名。加上name='info'。
- 利用django提供的reverse方法,reverse方法接收一個字符串,該字符串為url的名字。該方法返回該名字的url的路徑,再將這個路徑重新賦予給redirect實現動態跳轉。
- 當不同的項目app里面擁有相同名稱的url時,reverse函數就會發生沖突。django提供了一個app_name的變量來區分不同的app下擁有相同name的路由。
1 from django.urls import path 2 from .views import * 3 4 app_name = 'crm' 5 6 7 urlpatterns = [ 8 path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}), 9 path('info/', show_info, name='info'), 10 path('login/', login), 11 ]
1 from django.shortcuts import render, HttpResponse, redirect, reverse 2 3 # Create your views here. 4 5 6 def index(request, pk, id): 7 return HttpResponse('你輸入的參數是pk:{}-id:{}'.format(pk, id)) 8 9 10 def show_info(request): 11 return HttpResponse('<h1>hello world</h1>') 12 13 14 def login(request): 15 url = reverse('crm:info') 16 return redirect(url)
- 在app目錄下的路由模塊(urls.py)中定一個一個app_name的變量,app_name一般為當前app的名字。
- 在reverse函數里用寫上'app名字:路由的名字'(app_name:route_name)來對擁有相同名字的url來進行區分。
- reverse返回一個url路徑字符串
- reverse傳參
- reverse('app:name', kwargs={params:value})