十一、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','/') ) 
posted @   Bruce_JRZ  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示