Django 整数的 URL 模式

15 投票
2 回答
38045 浏览
提问于 2025-04-18 05:05

我刚开始学习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,}

没错 :) 这样也可以。但我们有一种简写方式来做到同样的事情,就是 +。正如文档中提到的,它会匹配任意非零数量的数字。

撰写回答