反向解析
常用解析:回顾以前惯用方式
跟据地址匹配urls
正则匹配urls
# 常用解析 url(r'^fan/$', views.fan), url(r'^fan1/$', views.fan1),
视图
# 常用解析 def fan(request): return render(request, 'Book/fan.html') def fan1(request): return HttpResponse('成功跳转到fan1')
模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>反向解析</title> </head> <body> <a href="/fan1/">跳转到fan1</a> <br> <br> </body> </html>
问题演示
- 修改正则表达式
url(r'^fan1/$', views.fan1),
为url(r'^fan123/$', views.fan1),
- 模板中跳转到
fan1
的地址不变 查看是否能成功跳转到
fan1
结论
- 问题:
- 随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式
- 但是正则表达式一旦修改了,之前所有对应的超链接都要修改,这是一件麻烦的事情
- 而且可能还会漏掉一些超链接忘记修改,是否有办法让链接根据正则表达式动态生成呢?
- 解决:反向解析
- 应用:反向解析应用在
模板中的超链接
,视图中的重定向
反向解析演练--模板中的超链接
修改正则表达式
url(r'^fan1/$', views.fan1),
为url(r'^fan123/$', views.fan1),
1.项目中添加 namespace属性
urlpatterns = [ url(r'^admin/', include(admin.site.urls)), # 常用解析 url(r'^', include('Book.urls')), # 反向解析 url(r'^', include('Book.urls', namespace='Book')) ]
2.应用中添加 name属性
url(r'^fan123/$', views.fan1, name='fan1'),
3.模板中动态生成地址
<a href="/fan1/">跳转到fan1</a>
<br>
<br>
{# 根据url动态生成地址 #}
<a href="{% url 'Book:fan1' %}">动态地址跳转到fan1</a>
反向解析演练--视图中的重定向
需要导入模块
from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse
重定向动态生成链接
# 重定向的反向解析 url(r'^redirect/$', views.redirect),
# 重定向的反向解析 def redirect(request): return HttpResponseRedirect(reverse('Book:fan1'))
反向解析演练--正则中取参数
有些正则表达式中是有参数的,包含
位置参数
、关键字参数
两种形式位置参数:反向解析
# 反向解析:正则取参数 url(r'^fan2/(\d+)/(\d+)/$', views.fan2, name='fan2')
# 反向解析:向正则中传参 def fan2(request, v1, v2): str = '%s--%s'%(v1,v2) return HttpResponse(str)
{# 向正则中传参 #}
<a href="{% url 'Book:fan2' 18 188 %}">动态地址和正则传参跳转到fan2</a>
位置参数:重定向反向解析
# 重定向的反向解析 def redirect(request): # return HttpResponseRedirect(reverse('Book:fan1')) # 重定向反向解析正则传参 return HttpResponseRedirect(reverse('Book:fan2', args=(18, 188)))
关键字参数:反向解析
# 反向解析:正则取参数 url(r'^fan2/(?P<v1>\d+)/(?P<v2>\d+)/$', views.fan2, name='fan2')
{# 向正则中传参 #}
<a href="{% url 'Book:fan2' v1=18 v2=188 %}">动态地址和正则传参跳转到fan2</a>
关键字参数:重定向反向解析
# 重定向的反向解析 def redirect(request): # return HttpResponseRedirect(reverse('Book:fan1')) # 重定向反向解析正则传参 # return HttpResponseRedirect(reverse('Book:fan2', args=(18, 188))) return HttpResponseRedirect(reverse('Book:fan2', kwargs={'v1':18, 'v2':188}))