在 Django 项⽬中,⼀个常⻅需求是获取最终形式的 URL,⽐如⽤于嵌⼊⽣成的内容中(视图和资源⽹址,给⽤户展示⽹址等)或⽤户服务器端的导航处理(重定向等)。
强烈建议不要硬编码 URL(这是⼀个费⼒、不能扩展、容易出错的主意)。同样危险的是设计临时机制来⽣成的 URL 与URLconf描述的设计的URL⼀样,这会导致URL 随着时间的推移变得过时。
换句话说,需要的是 DRY 机制。除其他优势外,它还允许 URL 设计⾃动更新,⽽不必遍历所有项⽬代码来搜索和替换过时的 URL 。
Django 提供执⾏反转 URL 的⼯具,这些⼯具与需要 URL 的不同层匹配:
在模板⾥:使⽤ url 模板标签。
在 Python 编码:使⽤ reverse() 函数。
一、路由命名
在定义路由的时候,可以为路由命名,⽅便查找特定视图的具体路径信息。
1、 在定义普通路由时,可以使⽤name参数指明路由的名字,如
根路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('film/',include('film.urls')),
]
子路由
# 查询所有影⽚信息
urlpatterns = [
path('login/',views.TestView),
path('filmlist/',views.OtherView,name='film-list')
]
视图:
def TestView(request):
url=reverse('film-list')
return HttpResponseRedirect(url)
def OtherView(request):
return HttpResponse('vip——film')
访问url:
http://127.0.0.1:8000/film/login/
重定向后的url:
http://127.0.0.1:8000/film/filmlist/
执行过程:
a、输入url(http://127.0.0.1:8000/film/login/),进行主路由、子路由寻址,
b、寻址成功调用loginview视图函数
c、执行url=reverse(‘film-list’),找到路由中的’film-list’,根据film-list,返回url(url:/film/filmlist/)
注意:函数中的参数:film-list,和路由中的参数保持一致
d、重定向HttpResponseRedirect(url),调用视图函数otherview,返回响应结果
2、传递参数的情况(uname)
特别注意1:需要在reverse函数中传递args=[‘参数’]
根路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('film/',include('film.urls')),
]
子路由:
urlpatterns = [
path('login/',views.loginview),
path('filmlist/<uname>',views.otherview,name='film-list')
]
视图:
def TestView(request):
url=reverse('test1',args=['kobe'])
return HttpResponseRedirect(url)
def OtherView(request,uname):
return HttpResponse(f'response-{uname}')
访问:
访问url:
http://127.0.0.1:8000/film/login/
重定向后的url:
http://127.0.0.1:8000/film/filmlist/kobe
特别注意2:视图函数中的形式参数中加上参数名称,与路由中的参数保持一致;如果不加视图中不加参数,会报下面的错误
3、对于指明namespace的,reverse(命名空间namespace:路由name)
对于未指明namespace的,reverse(路由name)
特别注意3:如果指定namespace 必须将include第⼀个参数设置为元组类型
主路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('staff/',include(('film.urls','film'),namespace='film-app'))
]
子路由:
urlpatterns = [
path('login/',views.TestView),
path('filmlist/<uname>',views.OtherView,name='test1')
]
视图:
def TestView(request):
url=reverse('film-app:test1',args=['kobe'])
return HttpResponseRedirect(url)
def OtherView(request,uname):
return HttpResponse(f'response-{uname}')
访问:
访问url:
http://127.0.0.1:8000/staff/login/
重定向后的url:
http://127.0.0.1:8000/staff/filmlist/kobe
4、模板中进⾏反向解析:
主路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('staff/',include(('film.urls','film'),namespace='film-app'))
]
子路由:
urlpatterns = [
path('login/',views.TestView),
path('filmlist/<uname>',views.OtherView,name='test1')
]
视图 :
def TestView(request):
return render(request,'film/index.html')
def OtherView(request,uname):
return HttpResponse(f'response-{uname}')
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="{% url 'film-app:test1' 'kobe' %}">click</a>
</body>
</html>
访问url:
http://127.0.0.1:8000/staff/login/
重定向后的url:
http://127.0.0.1:8000/staff/filmlist/kobe
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74265.html