django url 参数详解


通常我们建立一个django项目后, 其中重要的一步就是配置url, 一直原来对url了解的不是太多.今天详细研究一下.

from django.conf.urls import include, url
from django.contrib import admin
from web import views
urlpatterns = [
    # Examples:
    # url(r'^$', 's11bbs.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
]

上面是我建立项目之后,默认的url配置

url(regex, view, kwargs=None, name=None, prefix=''):
.......

这是url的源码


在URL请求达到django的路由系统的时候,也就是 url , 首先会匹配对应的regex, 如果匹配到了,就会执行 对应该条 regex 的views函数 .


regex 

代表一个正则表达式, 如果 请求的URL 为 http://www.timesnotes.com/ 那么对应的url 为 

url(r'^$', views.index,name="index"),

在这里我们还可以向后面的函数传递参数,   前面的文章有写 ,这里也会在简单的介绍一下.



view

url 正则匹配成功后, 就会执行相应的视图函数,django 使用用HttpResponse 对象作为第一个参数传递给views,  当 reges 参数中 带有参数时, 可以将其作为可选参数传递给views,

例:

url(r'^/index/(\d+)$', views.index,name="index"),

那么 括号里的 (\d+)  将会被作为地格纹参数传递给 view.index 函数,即 index(request, val) # val 对应(\d+)

注意:

如果我在传递参数的时候,给参数指定了名称,那么url 和views函数中的参数名称就必须保持一致.

url(r'^(?P<my_id>\d+)/$', views.get_id, name='GetID'),

此时,括号里对应的 (?P<my_id>\d+) 将作为第二个参数传递给 views.get_id函数,

即   get_id(request,my_id)  这里的参数名称 必须前后一致.




name

在我们设置urlconf的时候,  我们可能会遇到这种情况, 即 多条url conf 使用 同一视图函数. 这样在使用templates 系统的时候, 如果我们使用硬编码的方式 写代码, 模板将变得难以维护,

例1  在rulconf 使用如下配置的时候

url(r'^/index/$', views.index,name="index"),

 {% url views.index %} 中 的views.index 将返回 对应的 regex  “/index/"

例2

url(r'^/index/(\d+)$', views.index,name="index"),
url(r'^/index-add/(\d+)$', views.index,name="indexAdd"),

 此时 {% url views.index %} 想使用views函数名来返回url 的时候,就会遇到问题。

这个时候 name 参数的作用就体现出来了。 name 可以 用来 区别多个url 对应多个views函数的情况。 通过name 来反向获取URL。

我们可以使用如下的方式 获取对应的url

{% url index 1990 %} 

{% url indexAdd 2000 %} 





kwargs 

是一个子典型的参数,使用方式如下:


url(r'^/index-add/(\d+)$', views.index,{"memo":True},name="indexAdd"),


这里的kwargs 就是{”memo":True}


在对应的视图函数中 的使用方式为:

def index(request,val,memo):......