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.
Défi
MoyenAprès la publication, le navigateur doit afficher la page de la nouvelle offre d’emploi :
- Dans
jobs/models.py, ajoutez àJobune méthodeget_absolute_url()qui renvoie l’URL de sa page, la routejobs:detail. - Laissez
JobCreateViewtel 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)
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