整数的Django URL模式

时间:2014-05-02 04:17:16

标签: python regex django-urls

我是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模式?

3 个答案:

答案 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