反向解析

常用解析:回顾以前惯用方式

跟据地址匹配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}))