django额外参数的传递和url命名
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})