Django的反向解析的reverse与resolve函数实现
- reverse
通过路由命名或可调用的视图对象来生成路由地址
from django.shortcuts import render,reverse 引入reverse
- resolve
通过路由地址获取路由对象的信息
from django.urls import resolve 引入resolve
需要在reverse的基础上使用resolve
下面放例子
1、项目列表与项目的 urls.py
2、两个App的 urls.py
Index urls.py
User urls.py
3、两个App的 views.py
Index views.py
from django.shortcuts import render,reverse # 引入 reverse
from django.http import HttpResponse
# Create your views here.
def ShowIndexHTML(request):
kwargs = {'year':2021, 'month':6, 'day':1} # 以字典方式传递路由,如下面的 print
args = ['2021','1','1'] # 以列表方式传递路由,如下面的 print
# 此处使用的是 User中userLogin 的路由
print(reverse('User:userLogin', kwargs=kwargs)) # print 内容具体参考以下验证结果
print(reverse('User:userLogin', args=args))
return HttpResponse(reverse('User:userLogin', kwargs=kwargs)) # 参数 kwargs 和 args 不可同时设置,使用namespace和name需要 User:userLogin 写
User views.py
from django.shortcuts import render,reverse # 引入reverse
from django.http import HttpResponse
from django.urls import resolve # 引入 resolve
# Create your views here.
def userLogin(request, year, month, day):
args = ['1997', '9', '19'] # 以列表格式获取路由的变量信息
result = resolve(reverse('User:userLogin',args=args)) # 先使用 reverse,再使用 resolve
print('kwargs: ',result.kwargs) # print 内容具体参考以下验证结果
print('url_name: ', result.url_name)
return HttpResponse(str(year)+'-'+str(month)+'-'+str(day))
验证结果
① 访问 127.0.0.1:8000/Index/ (即ShowIndexHTML)
return HttpResponse(reverse(‘User:userLogin’, kwargs=kwargs))
返回的是 kwargs 字典的参数
此处 User前的 / 代表127.0.0.1:8000
② 访问 127.0.0.1:8000/User/1234/5/6 (即userLogin)
return HttpResponse(str(year)+’-’+str(month)+’-’+str(day))
返回str(year)+’-’+str(month)+’-’+str(day)
其中 print 的结果和具体参数
函数方法 | 说明 |
---|---|
func | 路由的视图函数对象或视图类对象 |
args | 以列表格式获取路由的变量信息 |
kwargs | 以字典格式获取路由的变量信息 |
url_name | 获取路由命名(name) |
app_name | 获取项目路由函数include的参数arg的第二个元素值 |
app_names | 与app_name功能一致,但以列表格式表示 |
namespace | 获取命名空间(namespace) |
namespaces | 与namespace功能一致,但以列表格式表示 |
view_name | 获取整个路由名称,格式:namespace:name |