Django 2 url路径匹配负值

时间:2018-02-19 14:08:44

标签: python django django-urls

在Django< 2中,正常的做法是使用正则表达式。但现在建议在Django => 2使用path()而不是url()

path('account/<int:code>/', views.account_code, name='account-code')

这看起来没问题并且匹配网址格式

/account/23/
/account/3000/

然而,这个问题是我还希望它匹配负整数,如

/account/-23/

请问我该怎么做路径()?

2 个答案:

答案 0 :(得分:15)

您可以编写custom路径转换器:

class NegativeIntConverter:
    regex = '-?\d+'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return '%d' % value

在urls.py中:

from django.urls import register_converter, path

from . import converters, views

register_converter(converters.NegativeIntConverter, 'negint')

urlpatterns = [
    path('account/<negint:code>/', views.account_code),
    ...
]

答案 1 :(得分:1)

我懒得做一个花哨的路径转换器,所以我只是把它捕获为一个字符串并在视图中将其转换为整数(进行一些基本的完整性检查以确保该值可以正确转换为整数):

urls.py

urlpatterns = [
    path('account/<str:code>/', views.account_code),
    ...
]

views.py

try:
    code = int(self.kwargs['code'])
except ValueError:
    raise ValueError("'code' must be convertible to an integer.")