Menu
CoddyTech

Llegar a la nueva oferta de empleo

Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 11 de 18.

Publica un empleo y Django lo guarda, pero se detiene: No URL to redirect to. Después de guardarlo, una CreateView redirige a su success_url. Si no hay una, le pide a la nueva fila su dirección mediante un método del modelo, get_absolute_url().

La dirección de la página de una fila depende de la fila, así que el método pertenece al modelo. Constrúyela con reverse(), que convierte el nombre y los argumentos de una ruta en una URL, tal como hace {% url %} en una plantilla:

class Recipe(models.Model):
    ...

    def get_absolute_url(self):
        return reverse("recipes:recipe", kwargs={"pk": self.pk})

Proporciona los argumentos por nombre con kwargs={...} o en orden con args=[...], e importa reverse desde django.urls. Una plantilla puede enlazar con {{ recipe.get_absolute_url }}, y una UpdateView también lleva allí.

challenge icon

Desafío

Intermedio

Después de publicar, el navegador debería abrir la página de la nueva oferta de trabajo:

  • En jobs/models.py, dale a Job un método get_absolute_url() que devuelva la URL de su página, la ruta jobs:detail.
  • Deja JobCreateView tal como está.

Pulsa Run y publica una oferta de trabajo: llegarás a su página.

Pruébalo tú mismo

from datetime import date

from django.conf import settings
from django.db import models
from django.utils.text import slugify


class Job(models.Model):
    title = models.CharField(max_length=200)
    company = models.CharField(max_length=200)
    city = models.CharField(max_length=100)
    salary = models.PositiveIntegerField(help_text="Yearly, in euros.")
    description = models.TextField(blank=True)
    posted = models.DateField(default=date.today)
    slug = models.SlugField(max_length=220, unique=True, blank=True)
    posted_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="jobs",
    )

    def __str__(self):
        return f"{self.title} at {self.company}"

    def save(self, *args, **kwargs):
        # Una nueva oferta de empleo obtiene un slug a partir de su título y empresa: "python-developer-acme".
        if not self.slug:
            base = slugify(f"{self.title} {self.company}") or "job"
            slug = base
            n = 2
            while Job.objects.filter(slug=slug).exists():
                slug = f"{base}-{n}"
                n += 1
            self.slug = slug
        super().save(*args, **kwargs)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django