Django 整数的 URL 模式
我刚开始学习Python和Django。我在urls.py文件里添加了一个URL模式,如下所示:
url(r'^address_edit/(\d)/$', views.address_edit, name = "address_edit"),
我希望我的网址能接受一个整数参数,这个整数可以有不同的位数,比如0、100、1000、99999,作为数据库表的“id”。但是我发现上面的模式只接受一个数字。如果我传入一个不是1位数的整数(比如999999),就会出现错误。
Reverse for 'address_edit' with arguments '(9999999,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['address_book/address_edit/(\\d)/$']
我该如何构建这个URL模式,让程序能够接受网址中任何位数的整数呢?
2 个回答
30
在Django 2.0及以上版本中,这个操作变得更加简单和清晰,像下面这样。
from django.urls import path
from . import views
urlpatterns = [
...
path('address_edit/<int:id>/', views.address_edit, name = "address_edit"),
...
]
28
这个正则表达式应该加上 +
修饰符,像这样
^address_edit/(\d+)/$
引用自 Python的正则表达式文档,
'+'
这个符号会让正则表达式匹配前面那个表达式出现1次或多次的情况。比如
ab+
会匹配一个a
后面跟着任意数量的b
,但只匹配a
是不行的。
\d
会匹配任何一个数字(0-9
)。不过它只会匹配一次。如果你想匹配两次,可以写成 \d\d
。但是如果你想匹配的数字越来越多,就得增加 \d
的数量。正则表达式有更简单的方法来做到这一点。如果你知道要匹配的数字个数,可以这样写
\d{3}
这样就能匹配三个连续的数字。如果你想匹配3到5个数字,正则表达式也能做到。
\d{3,5}
简单吧? :) 现在,它只会匹配3到5个数字(注意:少于3个的也不会匹配)。如果你想确保至少有1个数字,但最多可以是任意数量,你该怎么做呢?只需把范围开放,像这样
\d{3,}
现在,正则表达式引擎会匹配至少3个数字,最多可以是任意数量。如果你想匹配至少1个数字,最多也可以是任意数量,那你该怎么做呢?
\d{1,}
没错 :) 这样也可以。但我们有一种简写方式来做到同样的事情,就是 +
。正如文档中提到的,它会匹配任意非零数量的数字。