我是Python和Django的新手。我将URLPattern添加到urls.py中,如下所示:
url(r'^address_edit/(\d)/$', views.address_edit, name = "address_edit"),
我希望我的url接受一个长度可变的整数参数,例如。 0,100,1000,99999,用于" id"一个db表。但是我发现我只接受上述模式中的一位数字。如果我传递的整数不是1位数(例如999999),则显示错误
Reverse for 'address_edit' with arguments '(9999999,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['address_book/address_edit/(\\d)/$']
如何构建允许程序接受URL中任意数量的整数位数的URL模式?
答案 0 :(得分:22)
RegEx应该有+
修饰符,就像这样
^address_edit/(\d+)/$
引自Python's RegEx documentation,
'+'
使得到的RE匹配前一个RE的1次或更多次重复。
ab+
将匹配a
,后跟任何非零数量的b
s;它只与a
不匹配。
\d
将匹配任何数字(0-9
)。但它只会匹配一次。要匹配两次,您可以执行\d\d
。但随着要接受的位数增加,您需要增加\d
的数量。但RegEx有一种更简单的方法。如果您知道要接受的位数,那么您可以
\d{3}
这将接受三个连续的数字。如果您想接受3到5位数怎么办? RegEx涵盖了这一点。
\d{3,5}
简单,对吧? :)现在,它只接受3到5个数字(注意:任何小于3的数字也不会匹配)。现在,您要确保最少1个数字,但最大可以是任何数字。你会怎么做?只需将范围保持开放状态,就像这样
\d{3,}
现在,RegEx引擎将匹配最少3位数,最大值可以是任意数字。如果你想匹配最小的一位数,最大值可以是任何数字,那么你会做什么
\d{1,}
正确:)即使这样也行。但我们有一个速记符号来做同样的事情,+
。如文档中所述,它将匹配任何非零数字。
答案 1 :(得分:10)
在Django> = 2.0版本中,这是以更简洁的方式完成的,如下所示。
from django.urls import path
from . import views
urlpatterns = [
...
path('address_edit/<int:id>/', views.address_edit, name = "address_edit"),
...
]
答案 2 :(得分:-1)
您可以使用我的django帮助程序包Django Macros URL
这样可以让你的网址配置干净整洁。
你的例子将是
address_edit/:id
或
address_edit/:address_id