如果在视图、模板中使用了硬编码链接,在url配置发生改变时,就需要对原来的链接进行一一修改,费时费力还容易遗漏。解决办法是使用模板的时候,可以通过对路由设置命名空间和别名,然后通过url标签动态生成链接。以后链接会随路径正则变化自动更新。
目录
硬编码链接
硬编码路由就是通常我们直接写的地址栏的链接去掉域名后的部分。
这种简单方便,访问什么一目了然。缺点也是很明显,可以接着往下看。
配置路由
path('fan', views.fan),
视图
def fan(request):
return render(request, 'test/fan.html')
模板
设置模板链接进行跳转
<a href="/myapp/fan">点击跳转</a>
设置跳转后的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>反向解析</title>
</head>
<body>
<h2>反向解析</h2>
</body>
</html>
当我们修改了路由正则,就无法访问到原来的路由,需要修改原有链接才可继续访问。
而一般这个时候,我们会有很多地方都要修改,很麻烦还容易遗漏。
动态链接
动态链接是通过反向解析动态来生成的,需要一些设置,使用起来后期路由变动不受影响。
下面将演示如何设置和使用动态链接。
设置命名空间
设置命名空间有三种方式:
1.修改根路由文件中该应用路由的命名空间
格式为include(('应用路由','命名空间'))
urlpatterns = [
path('admin/', admin.site.urls),
# 增加路由 指向myapp urls
path(r'', include(('myapp.urls', 'app'))),
]
2.直接在urlpatterns中定义命名空间
app_patterns = ([
path('', include('myapp.urls')),
], 'app')
urlpatterns = [
path('admin/', admin.site.urls),
# 增加路由 指向myapp urls
path(r'myapp/', include(app_patterns)),
]
app_patterns是一个元组,第一个参数是path()或re_path()列表,第二个参数是URL的namespace。当使用include()方法引用app_patterns时,系统会自动为app_patterns中的所有URL添加namespace。
3.在应用子路由文件中设置命名空间
from django.urls import path
from . import views
app_name = 'app'
定义路由别名
path('fan', views.fan, name='fan'),
动态生成网址
<a href="/myapp/fan">/myapp/fan</a>
<br/>
<a href="{% url 'app:fan' %}">{% url 'app:fan' %}</a>
修改路由规则
path('fan1', views.fan, name='fan'),
刷新原有页面可发现动态生成的网址已发生改变,下面的动态路由已变更为最新的fan1,原来的为/myapp/fan。
动态路由传参
下面将演示动态链接传参情况设置与使用。
一个参数
路由
path('fan/<int:num>', views.fan, name='fan'),
模板
<a href="/myapp/fan/111">/myapp/fan/111</a>
<br/>
<a href="{% url 'app:fan' 222 %}">{% url 'app:fan' 222 %}</a>
两个参数
路由
path('fan/<int:num>/<int:num2>', views.fan, name='fan'),
模板
<a href="/myapp/fan/111/222">/myapp/fan/111/222</a>
<br/>
<a href="{% url 'app:fan' 111 222 %}">{% url 'app:fan' 111 222 %}</a>
总结
改为使用反向解析的动态路由后,修改路由正则规则,链接会自动变化为最新设置的路由。