logo cosasdedevs

Como crear urls amigables con slug en Django

Como crear urls amigables con slug en Django

My Profile
Oct 20, 2019

Cuando empecé a trastear con el framework de Django no conocía la funcionalidad para generar urls llamado slug. Recuerdo que para hacer algo parecido cree mi propia función e incluso funcionó durante las primeras versiones de desarrollo de este blog. Lo encontré de casualidad y lo cambié rápidamente en mi código (lección aprendida, hay que ver más a fondo la doc). Esta es su definición en la documentación de Django.

Una etiqueta corta para algo, que solo contiene letras, números, guiones bajo o raya. Generalmente se usan en las URLs. Por ejemplo en una típica URL de publicación de un blog.

Para este tutorial vamos a crear una tabla en la bbdd que guarde una url de tipo slug que luego usaremos para consultar en la base de datos que post estemos navengando en nuestra web.

Empezaremos por el modelo, lo primero que debemos hacer es importar la librería de slug, esto se hace con el siguiente comando:

from django.utils.text import slugify

Después en la clase de nuestro modelo lo que tenemos que hacer es crear un campo de tipo SlugField que es el contendrá nuestra url:

class Post(models.Model):
    """Post model."""

    title = models.CharField(max_length=255)
    image = models.ImageField(upload_to=content_file_name)
    post = models.TextField()

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    url = models.SlugField(max_length=255, unique=True)

Observad que estamos dándole el atributo unique=True para no tener conflictos a la hora de buscar un post.

Para finalizar el modelo lo que tendremos que hacer es crear la función save para crear la url en base al título, lo que nos dará un mejor SEO.

def save(self, *args, **kwargs):
    self.url = slugify(self.title)
    super(Post, self).save(*args, **kwargs)

Esto lo que hace es que antes de guardar nuestro post pasa el título por la función slugify y guarda el resultado en el campo url, después guardamos el post en nuestra bbdd.

Una vez hecho esto lo que queremos es recuperar un post a través de una url, para obtener la url lo que tenemos que hacer es lo siguiente:

path(
    route='posts/<slug:url>/',
    view=views.PostDetailView.as_view(),
    name='detail'
),

Aquí lo que decimos es que en route habrá un dato de tipo slug llamado url que es lo que queremos pasar a nuestra vista PostDetailView para su posterior tratamiento.

Para finalizar lo que haremos será recuperar el campo slug en la vista y en este caso como estoy usando el DetailView el se encargará de realizar la consulta:

class PostDetailView(DetailView):
    """Detail post."""
    template_name = 'posts/detail.html'
    model = Post
    context_object_name = 'post'
    slug_field = 'url'
    slug_url_kwarg = 'url'

slug_field es el nombre del campo en nuestra tabla, en este caso nosotros lo llamamos url y slug_url_kwarg es el nombre del argumento que pasamos por la url.

Espero que este post os haya ayudado para hacer vuestras urls más amigables :)

850 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!