es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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'),
]
“`

Tags:  , ,

Answer

  1. Avatar for 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:

    # urls.py modificado
    from django.urls import re_path
    
    urlpatterns = [
        path('', home, name='home'),
        re_path(r'^(?P<slug>[\w\-\/]+)/$', textview, name='textview'),
    ]
    

    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:

    # views.py modificado
    def textview(request, slug):
        try:
            obj = Text.objects.get(slug=slug)
        except Text.DoesNotExist:
            # Si el objeto no existe, podemos crearlo aquí
            obj = Text.objects.create(slug=slug, text='', password='123')
            created = True
        else:
            created = False
        return render(request, 'text/textpage.html', {'obj': obj, 'created': created})
    

    Ahora, podemos generar URL dinámicas con cualquier texto, incluido el carácter ‘/’, y se tratará como otro carácter más.

Comments are closed.