En Django <2, la forma normal de hacer esto es usar expresiones regulares. Pero ahora se recomienda en Django => 2 usar path() en lugar de url()
path('account/<int:code>/', views.account_code, name='account-code')Esto se ve bien y funciona bien con el patrón de URL coincidente
/account/23/ /account/3000/Sin embargo, este problema es que también quiero que esto coincida con un entero negativo como
/account/-23/Por favor, ¿cómo hago esto usando path ()?
Puede escribir un convertidor de ruta personalizado :
class NegativeIntConverter: regex = '-?\d+' def to_python(self, value): return int(value) def to_url(self, value): return '%d' % valueEn 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), ... ]Soy demasiado perezoso para hacer un convertidor de ruta elegante, así que lo capturé como una cadena y lo convertí en un número entero en la vista (con algunas comprobaciones básicas de cordura para asegurarme de que el valor se pueda convertir correctamente en un número entero):
urlpatterns = [ path('account/<str:code>/', views.account_code), ... ]Ejemplo de vista basada en funciones (FBV):
from django.http import HttpResponseNotFound def your_view(request, code): try: code = int(self.kwargs['code']) except ValueError: # produces HTTP status code 404: Not Found return HttpResponseNotFound( "'code' must be convertible to an integer.")Ejemplo de vista basada en clases (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']) except ValueError: # produces HTTP status code 404: Not Found return HttpResponseNotFound( "'code' must be convertible to an integer.") return super().dispatch(request, *args, **kwargs) Si quisiera que el usuario supiera que ocurrió un error del lado del cliente, podría sustituir HttpResponseNotFound con HttpResponseBadRequest , lo que daría un código de estado HTTP 400 (Solicitud incorrecta)
EDITAR: la versión a continuación produce un código de respuesta HTTP de error del servidor y probablemente no sea deseable (puede aparecer en los registros de errores, etc.)
try: code = int(self.kwargs['code']) except ValueError: # produces HTTP status code 500: Internal Server Error raise ValueError("'code' must be convertible to an integer.")