url()
函数可以传递四个参数,其中两个参数是必须传递的:regex
和view
,另外两个参数是可选的:kwargs
和name
。下面我们来讲解下这些参数:
url()参数:regex
词语regex
是regular expression
(即”正则表达式”)的缩写,它是一种搭配字符串中模式或者url模式的语法。Django会从第一个正则表达式开始,依次将请求的URL与列表中的正则表达式比较,直到发现搭配URL的正则表达式。
注意:正则表达式不会搜索GET
和POST
参数,或者域名。例如在对http://www.example.com/myapp/
的请求中,URLconf
会寻找myapp/
,而对http://www.example.com/myapp/?page=3
的请求中,URLconf
也会寻找myapp/
。
url()参数:view
当Django找到一个正则表达式搭配的时候,Django就会调用特定的视图函数,其中HttpRequest
对象是函数的第一个参数,其他从正则表达式捕获的值作为其他参数。
url()参数:kwargs
url()参数:name
为你的URL命名可以让你毫无疑议地从Django的别处特别是模版处找到它。这个强大的特点允许你对工程的URL模式做出全局的改变,而不用创建一个单独的文件。
写更多的视图
现在,我们在polls/views.py
里面添加更多的视图。这些视图有点不同,因为它们有一个参数:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,world.You're at the poll index")
def detail(request,question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request,question_id):
response="You're looking at the results of question %s"
return HttpResponse(response % question_id)
def vote(request,question_id):
return HttpResponse("You're voting on question %s" %question_id)
通过添加下面的url()
调用来将新的视图绑定到polls.urls
模块中。
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^$',views.index,name='index'),
url(r'^(?P<question_id>[0-9]+)/$',views.detail,name='detail'),
url(r'^(?P<question_id>[0-9]+)/results/$',views.results,name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$',views.vote,name='vote'),
]
打开你的浏览器,看一下/polls/34/
,它会运行detail()
方法,展示你在URL中提供的ID。也可以尝试下/polls/34/results
和/polls/34/vote
,它们会展示占位符结果和投票页面。
当有人从你的网站请求一个网页的时候,如/polls/34/
,Django会加载mysite/urls
这个python模块因为它被ROOT_URLCONF
设置所指向。它会发现名字为urlpatterns
的变量,以顺序来浏览正则表达式。我们使用的include()
函数仅仅引用其他的URLconfs
。注意,为include()
这个函数的正则表达式没有$
,而是以/
结尾。当Django遇到include()
这个函数的时候,它会将URL切割来搭配那个点,然后将剩下的字符串送给被include()
包含的URLconf
来做进一步处理。
include()
后面的想法是很容易对URL进行插入,因为polls
是用它们自己的URLconf
(即polls/urls.py),所以它们可以被放在/polls/
下面,或者/fun_polls/
或者/content/polls
下面,或者其他路径,应用仍然会工作。
如果用户访问系统中的/polls/34/
,就会发生下面的情况:
- Django将会发现对
'^polls/'
- Django会分隔搭配的文本(
polls/
)然后将剩下的文本,即"34/"
发送给polls.urls
的URLconf
来进行进一步处理匹配r'^(?P<question_id>[0-9]+)/$'
,这样就会调用detail()
视图方法
detail(request=<HttpRequest object>, question_id='34')
question_id='34'
部分是来自于(?P<question_id>[0-9]+)
。用括号包住模式会捕获匹配那个模式的文本,然后将文本作为参数传递给视图函数。?P<question_id>
定义了被用来区分匹配模式的名称。[0-9]+
是一个正则表达式来匹配一系列数字。