reverse函数
from django.urls import reverse
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
在网页模板中也是一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代码渲染成最终的页面是
<a href="/add/4/5/">link</a>
这样就可以通过 {% url 'add2' 4 5 %} 获取到对应的网址 /add/4/5/
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
注意看重点 add 变成了 new_add,但是后面的 name='add2' 没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成 /new_add/4/5/
用在 views.py 或 models.py 等地方的 reverse函数,同样会根据 name 对应的url获取到新的网址。
想要改网址的时候,修改 urls.py 中的正则表达式部分(url 参数第一部分),name 不变的前提下,其它地方都不需要修改。
另外,比如用户收藏夹中收藏的URL是旧的,如何让以前的 /add/3/4/自动跳转到现在新的网址呢?
要知道Django不会帮你做这个,这个需要自己来写一个跳转方法:
具体思路是,在 views.py 写一个跳转的函数:
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse # Django 1.4.x - Django 1.10.x
from django.urls import reverse # Django 1.10.x - Django 2.x
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
urls.py中:
url(r'^add/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
跳转网页
def reverse_fun_test(request):
return redirect(reverse('hello'))