Menu
CoddyTech

Arriver sur la nouvelle offre d'emploi

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 11 sur 18.

Publie un emploi et Django l’enregistre, puis s’arrête : No URL to redirect to. Après l’enregistrement, une CreateView redirige vers son success_url. Sans cette URL, elle demande à la nouvelle ligne son adresse au moyen d’une méthode du modèle, get_absolute_url().

L’adresse de la page d’une ligne dépend de cette ligne, la méthode appartient donc au modèle. Construis-la avec reverse(), qui transforme le nom et les arguments d’une route en URL, comme le fait {% url %} dans un template :

class Recipe(models.Model):
    ...

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

Fournis les arguments par leur nom avec kwargs={...}, ou dans l’ordre avec args=[...], et importe reverse depuis django.urls. Un template peut créer un lien avec {{ recipe.get_absolute_url }}, et une UpdateView y mène également.

challenge icon

Défi

Moyen

Après avoir publié une offre, le navigateur doit afficher la page de cette nouvelle offre. Dans jobs/models.py, ajoute à Job une méthode get_absolute_url() qui renvoie l’URL de sa page, la route jobs:detail. Cette route prend le slug de l’offre, et non son pk : l’offre Tea Taster chez Leafy renvoie /jobs/tea-taster-leafy/. Ne modifie pas JobCreateView.

Publie une offre : tu arrives sur sa page.

Essayez vous-même

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):
        # Une nouvelle offre d’emploi reçoit un slug dérivé de son titre et de son entreprise : "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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django