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.
Défi
MoyenAprè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)
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
4Vues de modification
CreateViewArriver sur la nouvelle offre d'emploiEntraînez-vous par vous-même : Playground Django