1.怎么从url中获取用户输入的参数?
urls.py
# ex: http://example.com/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
# ex: http://example.com/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
将匹配到的(?P<question_id>[0-9]+)最短数字串作为question_id传入views.detail函数。
PS: P应该是parameter的缩写
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
效果图:
改成\w即可匹配所有大小写字母还有阿拉伯数字了:
2.url函数中的name有什么用:
简单说,name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
实际需求:
我们计算加法的时候用的是 /add/4/5/ ,后来需求发生变化,比如改成 /4_add_5/,但在网页中,代码中很多地方都写死的 /add/4/5/,比如模板中可能是这么写的
<a href="/add/4/5/">计算 4+5</a>
如果这样写“死网址”,会使得在改了网址(正则)后,模板(template),视图(views.py,用以用于跳转),模型(models.py,可以用用于获取对象对应的地址)用了此网址的,都得进行相应的更改,修改的代价很大,一不小心,有的地方没改过来,就不能用了。
在网页模板中也是一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代码渲染成最终的页面是
<a href="/add/4/5/">link</a>
当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
add 变成了 new_add,但是后面的 name='add2' 没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成 /new_add/4/5/而不是老的add/4/5。
用在 views.py 或 models.py 等地方的 reverse函数,同样会根据 name 对应的url获取到新的网址。
-
但这只是改了服务端的超链接,用户端收藏的链接还是需要302跳转的啊 !
需要使用reverse函数进行转换:
>>> from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x
>>> from django.urls import reverse # django 1.10.x 新的,更加规范了
>>> reverse('add2', args=(4,5))
u'/add/4/5/'
>>> reverse('add2', args=(444,555))
u'/add/444/555/'
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
- 具体思路是,在 views.py 写一个跳转的函数:
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.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'),
这样,假如用户收藏夹中有 /add/4/5/ ,访问时就会自动跳转到新的 /new_add/4/5/ 了