反向解析

反向解析

现在,有十个app,每个都有一千万个a标签,都可以访问到你的 testadd,然后你的产品经理说,我想要改一下 urls 里面的 testadd ,把它改成 test_add,你只用改一下就好了,然后所有的 a 标签,全都访问不到了,这个时候难道要手动去改a标签的 href吗?

当然不可能,这时候就要用到反向解析了。

urlpatterns = [
    url(r'^test_add/', views.testadd,name='xxx')
]

只用在后面追加上一个 name ,也就是他的别名,然后在前端页面中的 a 标签里的 href 之中,不要直接写url了,改写成如下。

<a href="{% url 'xxx' %}">222</a>

这里的url将会动态的跟随你 urls 里面的配置更改而更改。

即使是

urlpatterns = [
    url(r'/^test_addasdfasfaxvsfqc/(\d+)/', views.testadd,name='xxx'),

他也会跟随他一起变成这样。

前端会用到,那么后端也会有用到,比如当你在重定向的时候, redirect 里面就要写url,这时候不一样,你要首先导入一个reverse模块,跟小白必会三板斧一样,都是从django.shortcuts里导入的。

from django.shortcuts import render,HttpResponse,redirect,reverse

在函数中:

def index(request):
     url = reverse('xxx')
     return redirect(url)

先用 reverse 反向解析出url ,然后把url放进去就好了。

有名与无名分组的反向解析

无名分组

也就是说,如果他 urls 里面的url是带正则表达式的,该如何做呢?

urlpatterns = [
url(r'^test_add/(\d+)/', views.testadd,name='xxx')
]

首先按照原本的方式来请求,发现出错,要求你给他一个参数。

在这之前,来真正的理解一下 什么是 反向解析

通过 reverse 也好, 通过前端也好,会得到一个结果,只要结果能满足这个表达式,都算反向解析成功。

现在只用在前端随便加一个数字在后面就可以了,因为这样就能满足这个正则表达式了。

<a href="{% url 'xxx' 13232 %}">222</a>
<a href="{% url 'xxx' 2 %}">222</a>
<a href="{% url 'xxx' 321 %}">222</a>
<a href="{% url 'xxx' 21313213 %}">222</a>

这时候就算你乱改这个正则表达式:

urlpatterns = [
url(r'^test_addafasxfvqv/(d+)/', views.testadd,name='xxx')
]

都没关系,前端会随着他的改变而改变。

通常反向解析后面带的数字都是 主键值

前端搞定了,那么来该搞后端了

后端直接访问会报和前端之前一样的错误,需要参数。这时候只需一步:

def index(request):
     url = reverse('xxx',arg=(1,))
     return redirect(url)

只需要给他加上一个数字就可以了,随便什么数字,我在这里加了一个1.

有名分组

url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>\d+)/', views.testadd,name='xxx'),
        前端解析
    	方式一、
            <a href="{% url 'xxx' 1 %}">222</a>
        方式二、    
            <a href="{% url 'xxx' year=1 %}">222</a>
        
        后端解析
        方式一、
            url = reverse('xxx',args=(1,))
            
        方式二、 
            url = reverse('xxx',kwargs={'year':123})# 不用浪费脑容量去记这种方式了,用第一种就好了
posted @ 2019-10-22 23:40  chanyuli  阅读(680)  评论(0编辑  收藏  举报