十一、Django url控制系统
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
匹配
1、完全匹配
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^showtime/', views.showtime),
url(r'^blog/', include('blog.urls')),
url(r'^login',views.login),
]
2、匹配指定位数数字
url(r'article/\d{4}',views.article_year), #匹配4位数字
获取参数
1、无名分组()获得参数
url(r'article/(\d{4})',views.article_year), #匹配4位数字
在视图函数中 增加形参year接受参数
def article_year(request, year):
return HttpResponse(year)
获得多个参数
url(r'article/(\d{4})/(\d{2})',views.article_year_month), #两个参数
def article_year_month(request, year, month):
return HttpResponse(year+month)
2、有名分组(?P<Name>)获得参数
url(r'article/(?P<year>\d{4})/(?P<month>\d{2})',views.article_year_month), #两个参数:year,month
def article_year_month(request, year, month): #这里的形参名必须与有名分组时相同
return HttpResponse(year+month)
别名
name参数设置别名
url(r'^login',views.login,name="login"),
html模版中 标签 {% url "login" %} 可以获得login的url
<div><a href="{% url "login" %}"></a></div>
模版中使用别名,则不管urls.py中视图的url如何修改,模版都不需同步修改。
urls分发
分发url : *****/blog/article/2023 到blog应用下的urls路由:
from django.conf.urls import include #引入 include模块
...
url(r'^blog/', include('blog.urls')), # ip/blog/...的url分发到blog下的urls.py中
...
在blog应用目录下创建urls.py文件,
from blog import views
urlpatterns = [
url(r'article/(\d{4})',views.article_year), #匹配4位数字
]
这样,在/blog/urls.py中即可处理/blog/....的url
reverse()路由解析
假设已经有了这么一个路由:
path('foo/', some_view, name='foo_name'),
想从页面模板某处链接跳转到视图函数中就非常容易了,用如下模板语法:
<a href="{% url 'foo_name' %}">Jump</a>
现在问题来了,如果我想从视图函数中跳转到另一个视图函数该怎么办呢?这种情况是有可能发生的,比如某个视图会根据条件的不同而转换到不同的视图中去。
很简单,有现成的 redirect() 函数可使用:
return redirect('/foo/')
但是这样把 url 硬编码到代码里了,不美。更好的写法就要用到主角** reverse()** 了:
return redirect(reverse('foo_name'))
这样写的好处是你可以任意更改 url 实际地址,只要路由的 name 不变,都是可以解析到正确的地址中去的。
带有参数的写法如下:
reverse('another_name', args=(id,))
因此带有参数的路由也可以正确解析了。简单又好用吧。
用之前记得导入:
from django.urls import reverse
from django.shortcuts import redirect
原文章地址:Django 知识库:reverse()路由解析 - 杜赛的文章 - 知乎 https://zhuanlan.zhihu.com/p/13
path、re_path
3以上的Django路由不再是url(...),而是path\re_path
from django.contrib import admin
from django.urls import path, re_path
from web import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
path('students', views.students, name='students'),
path('get_students/',views.get_students),
#要使用正则 要用re_path
re_path(r'^videos-(?P<direction>(\d+))-(?P<classification>(\d+))-(?P<level>(\d+))/',views.videos, name='videos'),
]
re_path('^(\w+)/((tag)|(category)|(date))/(\w+-*\w*)/$', views.blog_articles_by),
def blog_articles_by(request, *args):
print(args)
return HttpResponse(args)
#/JackBlog/date/2023-06/ ===> ('JackBlog', 'date', None, None, 'date', '2023-06')
#/JackBlog/tag/6/ ===> ('JackBlog', 'tag', 'tag', None, None, '6')
#使用有名参数!!!
re_path('^(?P<site>(\w+))/(?P<filter>((tag)|(category)|(date)))/(?P<param>(\w*-*\w+))/$', views.blog_articles_by),
def blog_articles_by(request, *args, **kwargs):
print(args, kwargs)
return HttpResponse(args)
#/JackBlog/date/2023-06/ ===> () {'site': 'JackBlog', 'filter': 'date', 'param': '2023-06'}
#因此视图函数改为:
def blog_articles_by(request,site,filter,param):
print(site, filter, param)
return HttpResponse(site)
# 两个href 有“/"与没有"/"是不一样的,一个是从网站路径开始,第二个是从当前路径开始
<li><a href="/{{ t.0 }}/">{{ t.1 }}</a></li>
<li><a href="{{ t.0 }}/">{{ t.1 }}</a></li>
#url后跟了next参数,这里获取,即登录成功后返回到原来页面)
return redirect( request.GET.get('next','/') )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库