The Definitive Guide To Django 2 学习笔记(四) 动态URLs

前面的例子中,虽然时间是动态可变的,但它的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)"的错误。

你可能感兴趣的:(django)