整数的Django URL模式

use*_*189 9 python regex django-urls

我是Python和Django的新手.我将URLPattern添加到urls.py中,如下所示:

    url(r'^address_edit/(\d)/$', views.address_edit, name = "address_edit"),
Run Code Online (Sandbox Code Playgroud)

我希望我的url接受一个具有可变长度的整数参数,例如0,100,1000,99999,用于db表的"id".但是我发现我只接受上述模式中的一位数字.如果我传递的整数不是1位数(例如999999),则显示错误

Reverse for 'address_edit' with arguments '(9999999,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['address_book/address_edit/(\\d)/$']
Run Code Online (Sandbox Code Playgroud)

如何构建URL模式,让程序接受来自URL的任意数量的整数?

the*_*eye 23

RegEx应该有+修饰符,就像这样

^address_edit/(\d+)/$
Run Code Online (Sandbox Code Playgroud)

引用Python的RegEx文档,

'+'

使得到的RE匹配前一个RE的1次或更多次重复.ab+将匹配a后跟任何非零数量的bs; 它不会匹配a.

\d将匹配任何数字(0-9).但它只会匹配一次.要匹配两次,你可以这样做\d\d.但随着要接受的位数增加,您需要增加\ds 的数量.但RegEx有一种更简单的方法.如果您知道要接受的位数,那么您可以这样做

\d{3}
Run Code Online (Sandbox Code Playgroud)

这将接受三个连续的数字.如果您想接受3到5位数怎么办?RegEx涵盖了这一点.

\d{3,5}
Run Code Online (Sandbox Code Playgroud)

简单,对吧?:)现在,它只接受3到5个数字(注意:任何小于3的数字也不会匹配).现在,您要确保最少1个数字,但最大可以是任何数字.你会怎么做?只需将范围保持开放,就像这样

\d{3,}
Run Code Online (Sandbox Code Playgroud)

现在,RegEx引擎将匹配最少3位数,最大值可以是任意数字.如果你想匹配最小的一位数,最大可以是任何数字,那么你会做什么

\d{1,}
Run Code Online (Sandbox Code Playgroud)

正确:)即使这样也行.但是我们有一个速记符号来做同样的事情+.如文档中所述,它将匹配任何非零数字.


Sup*_*ova 14

在Django> = 2.0版本中,这是以更清洁和更简单的方式完成的,如下所示.

from django.urls import path

from . import views

urlpatterns = [
    ...
    path('address_edit/<int:id>/', views.address_edit, name = "address_edit"),
    ...
]
Run Code Online (Sandbox Code Playgroud)