【django】路由命名和路由反向解析(更新)

导读:本篇文章讲解 【django】路由命名和路由反向解析(更新),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在 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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!