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.

Publiez une offre d’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 doit donc appartenir au modèle. Construisez-la avec reverse(), qui transforme le nom et les arguments d’une route en URL, comme le fait {% url %} dans un modèle :

class Recipe(models.Model):
    ...

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

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

challenge icon

Défi

Moyen

Après la publication, le navigateur doit afficher la page de la nouvelle offre d’emploi :

  • Dans jobs/models.py, ajoutez à Job une méthode get_absolute_url() qui renvoie l’URL de sa page, la route jobs:detail.
  • Laissez JobCreateView tel quel.

Cliquez sur Run et publiez une offre : vous arriverez 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 généré à partir de son titre et du nom de l’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