zoukankan      html  css  js  c++  java
  • 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代表的意思是原生字符,即 被当作两个字符而不被转义。

    2.正则表达式中d+需要用括号括起来,否则将会出现"takes exactly 2 arguments (1 given)"的错误。

  • 相关阅读:
    好文章集合
    WPF:布局
    xcode6.0 模拟器打不开
    vue-vux初学
    【个人笔记】《知了堂》MySQL三种关系:一对一,一对多,多对多。
    vue-axios跨域配置
    vue+webpack使用
    vs code插件
    echarts图表属性设置
    【个人笔记】《知了堂》ajax的get及post请求
  • 原文地址:https://www.cnblogs.com/kfx2007/p/3425424.html
Copyright © 2011-2022 走看看