为什么这里要说urls通用函数(也可以叫公用函数),这些函数是可以在django的views,template中引用的。
reverse()反向解析url路径函数,根据参数反向解析出路径,用于http的重定向,或者是在网页上解析a标签的链接。reverse()的参数可以是views函数,命令url的name值,如果这个url是有参数的,reverse()也可以增加参数。 reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) 因为url的route与view函数一一对应,一个视图可以反向解析得到一个url路径。
注意:案例操作依托于上一章节创建的项目
#在views视图函数中使用reverse()函数,reverse()可以接受视图函数名称,或者命令url的name作为参数。
#先配置路由
[root@work1 mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path
from . import views
from myblog.views import art,old_art #<--新增
urlpatterns = [
path('art',art,name='art'),
path('old_art',old_art,name='old_art'), #<--新增
path('',views.index,name='index'),
path('admin/', admin.site.urls),
]
#配置myblog的视图,新增old_art视图,使用HttpResponseRedirect重定向到新的路由/art
[root@work1 mysite]# vim myblog/views.py
from django.shortcuts import render,HttpResponseRedirect #<--新增
from .models import Programa,Article
from django.urls import reverse #<--新增
def art(req):
progs=Programa.objects.all()
art=Article.objects.all()[0]
return render(req,'art.html',locals())
def old_art(req): #<--新增
print(reverse('art')) #<--新增,此处是使用name='art'的命名路由进行反向解析
print(reverse(art)) #<--新增,此处使用上面的视图函数art反向解析,效果一样
return HttpResponseRedirect(reverse('art')) #<--新增
#访问http://你的IP:PORT/old_art,可以查看跳转情况
配置art.html模板增加返回首页 ,访问http://你的IP:PORT/art查看效果
[root@work1 mysite]# vim templates/art.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a> <!--新增加的一行-->
</body>
</html>
[root@work1 mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path
from . import views
from myblog.views import art, old_art
urlpatterns = [
path('art/<art_id>/',art,name='art'), #<--修改url路由可以接受一个参数art_id
path('old_art',old_art,name='old_art'),
path('',views.index,name='index'),
path('admin/', admin.site.urls),
]
#修改old_art视图;
[root@work1 mysite]# vim myblog/views.py
from django.shortcuts import render,HttpResponseRedirect
from .models import Programa,Article
# Create your views here.
from django.urls import reverse
def art(req, art_id):
progs=Programa.objects.all()
art=Article.objects.get(pk=art_id) #<--修改
return render(req,'art.html',locals())
def old_art(req):
print(reverse('art', args=('1',)))
print(reverse(art, args=('1',))) #<--此处与上面作用相同,注意用法不同
print(reverse(art, kwargs={'art_id':'1'})) #<--此处与上面作用相同,注意用法不同
return HttpResponseRedirect(reverse('art', args=('1',)))
#访问http://你的IP:PORT/old_art查看效果
2、在template中使用:
[root@work1 mysite]# vim templates/art.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a>
<a href={% url 'art' art_id='1' %}>当前页面是{% url 'art' art_id='1' %}</a> <!--新增-->
</body>
</html>
#访问http://你的IP:PORT/art/1查看效果
namespace可以用于对不同app的反向解析path时,区分app,防止不同app的视图解析出相同的path地址。
#修改url.py
[root@work1 mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path, include #<--add include
from . import views
from myblog.views import old_art
urlpatterns = [
path('art/',include(('myblog.urls', 'myblog'), namespace='myblog')), #<--修改
path('old_art/', old_art, name='old_art'),
path('',views.index,name='index'),
path('admin/', admin.site.urls),
]
#新增加myblog/urls.py,并编辑
[root@work1 mysite]# vim myblog/urls.py
from django.urls import path, include
from . import views
urlpatterns = [
path('<art_id>/', views.art, name='art'),
]
#修改视图文件
[root@work1 mysite]# vim myblog/views.py
from django.shortcuts import render,HttpResponseRedirect
from .models import Programa,Article
# Create your views here.
from django.urls import reverse
def art(req, art_id):
progs=Programa.objects.all()
art=Article.objects.get(pk=art_id)
return render(req,'art.html',locals())
def old_art(req):
print(reverse('myblog:art', args=('1',))) #<--需要变更的地方
print(reverse('myblog:art', kwargs={'art_id':'1'})) #<--需要变更的地方
return HttpResponseRedirect(reverse('myblog:art', args=('1',))) #<--需要变更的地方
#修改template文件
[root@work1 mysite]# vim templates/art.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a>
<a href={% url 'myblog:art' art_id='1' %}>当前页面是{% url 'myblog:art' art_id='1' %}</a> <!--修改此行代码-->
</body>
</html>
#访问你的http://你的IP:PORT/old_art和http://你的IP:PORT/art/1查看效果
此函数用于url文件没加载时解析路径, 是reverse()的延迟加载版本,django有自身的模块加载顺序,有时没加载url配置,但是需要解析url,可以使用延迟加载. reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
根绝url解析命名url_name,常用于调试。
用法
from django.urls import resolve resolve('/art/1/').func resolve('/art/1/').url_name
用于获取网站的url前缀,整个项目都是在http://www.example.com/ 下的,get_script_prefix()用于获取url的前缀,set_script_prefix是用于设置前缀的函数,此函数了解即可。
函数名 | 解释用法 |
---|---|
path() | 不使用正则表达式,path(route, view, kwargs=None, name=None) |
re_path() | 用于url正则表达式匹配,re_path(r'^bio/(?P |
include() | 用于引用其他app的urls.py文件,用法include(module, namespace=None),include(module, namespace=None),include((pattern_list, app_namespace), namespace=None) |
register_converter() | 注册自定义的参数类型转换,通过url传递参数时可以定义参数转换为自己定义的类型 |
static() | 不常用 |
url() | django 1.*版本中使用的url(),支持正则表达式与re_path()功能相同,已经建议弃用url()函数 |
handler400 | 非debug模式下(settings.py中配置DEBUG = False,ALLOWED_HOSTS = ['*'),用于自定义400错误的页面,写在urls.py中末尾加一行handler404="app_name.views.your_func_name" |
handler403 | 非debug模式下,用于自定义403错误的页面,写在urls.py中末尾加一行handler403="app_name.views.your_func_name" |
handler404 | 非debug模式下,用于自定义404错误的页面,写在urls.py中末尾加一行handler404="app_name.views.your_func_name" |
handler500 | 非debug模式下,用于自定义500错误的页面,写在urls.py中末尾加一行handler500="app_name.views.your_func_name" |
在re_path函数中()括号中的表达式表示一个参数。传递给视图的参数如何接收使用可以查看python函数传参的相关文档,下面是部分例子:
正则表达式明细表: