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

这里写目录标题

在 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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django中,路由(routing)是指将URL(统一资源定位符)映射到相应的视图函数或类的过程。Django使用URLconf(URL配置)来配置路由。 URLconf是一个Python模块,它定义了URL模式和对应的处理函数或类。Django通过匹配URL模式来确定应该调用哪个处理函数或类来处理请求。下面是一些关于Django路由的详细解释: 1. 根URLconf:每个Django项目都有一个根URLconf,它负责处理项目的根URL。这个根URLconf通常是项目目录中的urls.py文件,它定义了项目的顶级URL模式。 2. URL模式:URL模式是一个正则表达式(或字符串),用于匹配请求的URL。它可以包含变量和其他特殊字符来提取URL中的参数。URL模式在根URLconf和应用程序的URLconf中定义。 3. 处理函数或类:当URL模式与请求的URL匹配时,将调用相应的处理函数或类来处理请求。处理函数可以是常规的Python函数,也可以是基于类的视图。处理函数或类负责处理请求并返回响应。 4. 命名URL:Django允许为每个URL模式分配一个唯一的名称。这样可以使得在代码中引用URL更加方便和可维护。命名URL可以通过名称反向解析为对应的URL。 5. 包含(include):Django路由系统支持将URL模式划分为不同的模块。可以使用include函数将其他URLconf包含到主URLconf中,实现路由的分发和管理。 6. 参数传递:URL模式可以包含变量,这些变量可以从URL中提取出来,并作为参数传递给处理函数或类。这样可以实现动态的URL匹配和处理。 7. URL分发和重定向:Django允许将请求分发到不同的处理函数或类,并支持URL重定向。这样可以实现将请求从一个URL转发到另一个URL。 总的来说,Django路由系统提供了灵活和强大的功能,可以帮助开发者管理项目中的URL,并将请求分发到适当的处理函数或类。通过定义URL模式和处理函数或类,可以实现对不同URL的定制化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值