前面的例子中,虽然时间是动态可变的,但它的URL却是静态的(/time/).很多时候,URL也是需要动态改变,然后展示出不通的内容来。现在我们就来创建一个可以动态改变URL的例子。
如果URLconf 是下面这样:
urlpatterns = patterns('', ('^time/$', current_datetime), ('^time/plus/1/$', one_hour_ahead), ('^time/plus/2/$', two_hours_ahead), ('^time/plus/3/$', three_hours_ahead), ('^time/plus/4/$', four_hours_ahead), )
缺点很明显,1,2,3,4,如果有更多,我们则需要创建更多的URL样式跟与之对应的View Fucntion
那么如何解决上面的问题呢?
答案是利用正则表达式。上面的4条URL样子可以用正则表达式如下表达:
urlpatterns = patterns('', # ... (r'^time/plus/\d+/$', hours_ahead), # ... )
这样不仅可以替代上面的4条,就算是/time/plus/100000同样也适用。
(关于正则表达式,请查相关资料)
有了正则表达式,接下来我们需要做的就很简单了,添加处理函数:
from django.http import Http404, HttpResponse import datetime def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
1. hours_head 函数有两个参数request 和 offset
2. request,前面已经碰到过,它总是第一个参数
3.offset 是URL样式中的匹配的参数,例如/time/plus/3,offset=3,
如果是/time/plus/21,那么offset就是21
4.这里我们起名为offset,实际上你想叫什么名都可以。
5.函数中需要注意的是 int(),它的作用是把字符转换成数字。
6.如果offset被赋值了不能被转换成数字的值,那么将会触发ValueError异常,你将会看到一个404的页面
Attention:
1.正则表达式中前缀r代表的意思是原生字符,即\n\r被当作两个字符而不被转义。
2.正则表达式中\d+需要用括号括起来,否则将会出现"takes exactly 2 arguments (1 given)"的错误。