如果在视图、模板中使用了硬编码链接,在url配置发生改变时,就需要对原来的链接进行一一修改,费时费力还容易遗漏。解决办法是使用模板的时候,可以通过对路由设置命名空间和别名,然后通过url标签动态生成链接。以后链接会随路径正则变化自动更新。
目录
硬编码链接
配置路由
视图
模板
动态链接
设置命名空间
定义路由别名
动态生成网址
修改路由规则
动态路由传参
一个参数
两个参数
总结
硬编码路由就是通常我们直接写的地址栏的链接去掉域名后的部分。
这种简单方便,访问什么一目了然。缺点也是很明显,可以接着往下看。
path('fan', views.fan),
def fan(request):
return render(request, 'test/fan.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'),
/myapp/fan
{% url 'app:fan' %}
path('fan1', views.fan, name='fan'),
刷新原有页面可发现动态生成的网址已发生改变,下面的动态路由已变更为最新的fan1,原来的为/myapp/fan。
下面将演示动态链接传参情况设置与使用。
路由
path('fan/', views.fan, name='fan'),
模板
/myapp/fan/111
{% url 'app:fan' 222 %}
路由
path('fan//', views.fan, name='fan'),
模板
/myapp/fan/111/222
{% url 'app:fan' 111 222 %}
改为使用反向解析的动态路由后,修改路由正则规则,链接会自动变化为最新设置的路由。