在Django的URLconf中使用命名组的方法

作者:goldensun 时间:2021-05-30 06:20:15 

在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。 在更高级的用法中,还可以使用 命名 正则表达式组来捕获URL,并且将其作为关键字参数传给视图。

一个 Python 函数可以使用关键字参数或位置参数来调用,在某些情况下,可以同时进行使用。 在关键字参数调用中,你要指定参数的名字和传入的值。 在位置参数调用中,你只需传入参数,不需要明确指明哪个参数与哪个值对应,它们的对应关系隐含在参数的顺序中。

例如,考虑这个简单的函数:


def sell(item, price, quantity):
 print "Selling %s unit(s) of %s at %s" % (quantity, item, price)

为了使用位置参数来调用它,你要按照在函数定义中的顺序来指定参数。


sell('Socks', '$2.50', 6)

为了使用关键字参数来调用它,你要指定参数名和值。 下面的语句是等价的:


sell(item='Socks', price='$2.50', quantity=6)
sell(item='Socks', quantity=6, price='$2.50')
sell(price='$2.50', item='Socks', quantity=6)
sell(price='$2.50', quantity=6, item='Socks')
sell(quantity=6, item='Socks', price='$2.50')
sell(quantity=6, price='$2.50', item='Socks')

最后,你可以混合关键字和位置参数,只要所有的位置参数列在关键字参数之前。 下面的语句与前面的例子是等价:


sell('Socks', '$2.50', quantity=6)
sell('Socks', price='$2.50', quantity=6)
sell('Socks', quantity=6, price='$2.50')

在 Python 正则表达式中,命名的正则表达式组的语法是 (?P<name>pattern) ,这里 name 是组的名字,而 pattern 是匹配的某个模式。

下面是一个使用无名组的 URLconf 的例子:


from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
 (r'^articles/(\d{4})/$', views.year_archive),
 (r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)

下面是相同的 URLconf,使用命名组进行了重写:


from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
 (r'^articles/(?P<year>\d{4})/$', views.year_archive),
 (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)

这段代码和前面的功能完全一样,只有一个细微的差别: 取的值是以关键字参数的方式而不是以位置参数的方式传递给视图函数的。

例如,如果不带命名组,请求 /articles/2006/03/ 将会等同于这样的函数调用:


month_archive(request, '2006', '03')

而带命名组,同样的请求就会变成这样的函数调用:


month_archive(request, year='2006', month='03')

使用命名组可以让你的URLconfs更加清晰,减少搞混参数次序的潜在BUG,还可以让你在函数定义中对参数重新排序。 接着上面这个例子,如果我们想修改URL把月份放到 年份的 前面 ,而不使用命名组的话,我们就不得不去修改视图 month_archive 的参数次序。 如果我们使用命名组的话,修改URL里提取参数的次序对视图没有影响。

当然,命名组的代价就是失去了简洁性: 一些开发者觉得命名组的语法丑陋和显得冗余。 命名组的另一个好处就是可读性强。

标签:Django,URLconf
0
投稿

猜你喜欢

  • pandas 层次化索引的实现方法

    2023-11-24 19:04:02
  • Pycharm cannot set up a python SDK问题的原因及解决方法

    2022-12-21 15:05:34
  • Pygame游戏开发之太空射击实战入门篇

    2023-07-17 23:12:42
  • Python基于codecs模块实现文件读写案例解析

    2023-08-31 16:25:21
  • 在IE浏览器下面指定表单编码方式

    2009-10-02 16:47:00
  • Jil,高效的json序列化和反序列化库

    2023-07-02 05:30:43
  • MAC下MySQL初始密码忘记怎么办

    2024-01-20 03:54:05
  • 更改localhost为其他名字的方法

    2023-11-23 08:07:52
  • Python中反转二维数组的行和列问题

    2021-06-24 13:48:27
  • Django配置MySQL数据库的完整步骤

    2023-07-19 14:43:47
  • 解决pycharm上的jupyter notebook端口被占用问题

    2022-10-28 15:43:13
  • asp超强的Server Application Error 的解决方法

    2008-11-13 13:04:00
  • javascript验证只能输入数字和一个小数点示例

    2024-04-22 22:29:11
  • Python unittest discover批量执行代码实例

    2023-08-14 14:05:37
  • MySql 8.0.16版本安装提示已经不使用“UTF8B3”而是使用“UTF8B4”问题

    2024-01-23 12:43:57
  • JavaScript实现的反序列化json字符串操作示例

    2024-04-10 10:46:01
  • SQL查询效率:100w数据查询只需要1秒钟

    2008-12-09 14:36:00
  • MySQL基础教程之事务异常情况

    2024-01-15 06:12:20
  • 简化版的vue-router实现思路详解

    2024-05-10 14:17:28
  • python实现固定尺寸图像拼接

    2021-12-16 20:27:01
  • asp之家 网络编程 m.aspxhome.com