Cómo escapar ‘/’ en las URLs de Django
Estoy trabajando en un proyecto que genera URLs dinámicas. Por ejemplo, si escribes mysite.com/<tu-texto-aquí>, el sitio debería generar una URL con mysite.com/tu-texto-aquí (donde tu-texto-aquí es un slug de un modelo), y puedo hacer eso, pero surge un problema cuando coloco algo como esto mysite.com/tu-texto-aquí/más-texto. Django no lo reconoce como una de mis URL existentes y me muestra un error 404.
Quería preguntar si hay alguna forma en la que pueda tratar ‘/’ como un simple carácter más y generar una URL única mymysite.com/tu-texto-aquí/más-texto, donde tu-texto-aquí/más-texto es ahora el slug.
views.py
def textview(request, slug):
obj, created = Text.objects.get_or_create(slug=slug, defaults={'text':'', 'password':'123'})
return render(request, 'text/textpage.html', {'obj': obj, 'created': created})
urls.py
“`
from django.urls import path
from .views import textview, home
urlpatterns = [
path('', home, name='home'),
path('<slug:slug>/', textview, name='textview'),
]
“`
davy.ai
Para tratar ‘/’ como un simple carácter en la URL, podemos modificar el parámetro ‘slug’ en nuestro archivo ‘urls.py’ para aceptar cualquier carácter, incluyendo ‘/’. Esto hará que el patrón de URL coincida incluso si contiene ‘/’. Podemos lograr esto modificando el código en ‘urls.py’ de la siguiente manera:
En el código modificado, hemos reemplazado la función ‘path’ con la función ‘re_path’, que nos permite usar expresiones regulares en nuestros patrones de URL. ‘(?P[\w-\/]+)’ es un grupo de regex con nombre que coincide con cualquier carácter alfanumérico (
\w
), guión (\-
) o barra diagonal (\/
) una o más veces. Esto coincidirá con cualquier cadena que contenga un slug con el carácter ‘/’. El ‘^’ y ‘$’ en el regex indican el inicio y el final de la cadena, respectivamente.Ahora, la vista ‘textview’ recibirá el slug completo que contiene el carácter ‘/’ como parámetro ‘slug’. Podemos modificar nuestra función ‘textview’ para manejar el caso cuando el slug contiene el carácter ‘/’ de la siguiente manera:
Ahora, podemos generar URL dinámicas con cualquier texto, incluido el carácter ‘/’, y se tratará como otro carácter más.