Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

166
Vistas
Django 2 ruta de URL que coincide con el valor negativo

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 ()?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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' % value

En 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), ... ]
over 4 years ago · Santiago Trujillo Denunciar

0

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):

urls.py

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

vistas.py (nuevo)

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

views.py (antiguo, dejado aquí por razones históricas)

 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.")
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda