Django2url路径匹配负值

qrjkbowd  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(123)

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

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

字符串
这看起来不错,并且可以很好地匹配URL模式

/account/23/
/account/3000/


但是,这个问题是,我也希望这个匹配负整数一样

/account/-23/


请问如何使用path()实现此操作?

col17t5w

col17t5w1#

您可以编写自定义路径转换器:

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),
    ...
]

yizd12fk

yizd12fk2#

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

urls.py

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

字符串

views.py(新增)

基于功能的视图(FBV)示例:

from django.http import HttpResponseNotFound

def your_view(request, code):
    try:
        code = int(self.kwargs['code'])  # cast to integer
    except ValueError:
        return HttpResponseNotFound(
            "'code' must be convertible to an integer.")


基于类的视图(CBV)示例:

from django.http import HttpResponseNotFound
from django.views.generic import TemplateView

class CodeView(TemplateView):

    def dispatch(self, request, *args, **kwargs):
        try:
            code = int(self.kwargs['code'])  # cast to integer
        except ValueError:
            return HttpResponseNotFound(
                "'code' must be convertible to an integer.")
        return super().dispatch(request, *args, **kwargs)


如果你想让用户知道发生了客户端错误,你可以用HttpResponseBadRequest代替HttpResponseNotFound,这将给予一个HTTP状态码400(Bad Request)。
编辑:下面的版本会产生一个服务器错误HTTP响应代码,可能是不可取的(可能会出现在错误日志中等)

views.py(旧版本,由于历史原因留在此处)

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

相关问题