django中url反向解析详解。
反向解析
反向解析
在url视图匹配中如何我们用硬编码连接,当我们在改变url地址时我们的超链接写的是硬编码连接,那么我们需要改变大量的超链接这样不方便去维护。
反向解析就是动态获取url的一种方式. 动态获取网站地址,如果改变了网址,我们也需要修改,但是如果使用了反向解析,动态获取的情况下 不管对方如何变化,我们都能拿到。
如下是反向解析举例:
我们在默认的url跟目录的配置如下:
urlpatterns = [
path('admin/', admin.site.urls),
url(r'',include("blog.urls")),
]
在app下创建的url配置如下:
urlpatterns = [
url(r'get/$',views.myblogs),
url(r'sends/$',views.get),
]
视图views配置如下:
def myblogs(request):
return render(request,'templates/myseit/blog.html')#匹配的模板名称为blog.html
def get(request):
return render(request,'templates/myseit/index.html')#匹配的模板名称为index.html
我们在模板中创建两个模板分别写上超链接
第一个模板名称为blog.html进行视图匹配
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一篇博客</title>
</head>
<body>
<p>测试超链接</p>
</body>
</html>
第二个模板名称为index.html(随意写为了测试用)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个</title>
</head>
<body>
<a href="/get/">efefefefefefe</a>
</body>
</html>
这样就是可以实现视图的匹配和跳转这是一种用硬编码连接写的超链接地址,但是我们如果一旦更改了根级目录下的url配置路径
urlpatterns = [
path('admin/', admin.site.urls),
url(r'sunck/',include("blog.urls")),#添加新的url匹配地址
]
这样的话我们就需要改变上述的index.html中的模板连接,否则就会出错。
但是一个项目中会有很多的url超链接改起来很费劲,所以这个时候就需要上述的url反向解析:
以下是url反向解析的配置方法:
在配置根级目录中的url时添加一个namespace参数:
#django2.0的配置方法
urlpatterns = [
path('admin/', admin.site.urls),
url(r'sunck/',include(('myblog.urls',"myblog"),namespace='myblog'))
]
#django2.0之前的配置
urlpatterns = [
path('admin/', admin.site.urls),
url(r'sunck/',include('myblog.urls',namespace='myblog'))
]
如果django2.0以后还用之前的配置话会报错错误信息如下:
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name in
stead.
接下来我们在app下的urls.py中配置(添加一个name参数):
urlpatterns = [
url(r'get/$',views.myblogs,name='get'),
url(r'sends/$',views.get,name='sends'),
]
然后我们在模板中引用引入绝对路径:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个</title>
</head>
<body>
<a href="/get/">efefefefefefe</a>
<a href={% url 'myblog:get'%}>连接</a>
</body>
</html>
这样就是url的反向解析。
此文为自己百度以后自己总结的方法,如果写的不多还望大家帮忙指正。