反向解析
反向解析
现在,有十个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})# 不用浪费脑容量去记这种方式了,用第一种就好了