Auf der neuen Stelle landen
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 11 von 18.
Veröffentliche einen Job, und Django speichert ihn, hält dann aber an: No URL to redirect to. Nach dem Speichern leitet eine CreateView zu ihrer success_url weiter. Gibt es keine, fragt sie die neue Zeile über eine Modellmethode nach ihrer Adresse: get_absolute_url().
Die Adresse der Seite einer Zeile hängt von der Zeile ab, daher gehört die Methode zum Modell. Erstelle sie mit reverse(), das den Namen und die Argumente einer Route in eine URL umwandelt, wie es {% url %} in einer Vorlage tut:
class Recipe(models.Model):
...
def get_absolute_url(self):
return reverse("recipes:recipe", kwargs={"pk": self.pk})Übergib die Argumente entweder mit Namen über kwargs={...} oder der Reihenfolge nach mit args=[...] und importiere reverse aus django.urls. Eine Vorlage kann mit {{ recipe.get_absolute_url }} verlinken, und auch eine UpdateView leitet dorthin weiter.
Aufgabe
MittelNach dem Veröffentlichen sollte der Browser auf der Seite des neuen Jobs landen. Gib in jobs/models.py Job eine Methode get_absolute_url(), die die URL seiner Seite zurückgibt, die Route jobs:detail. Diese Route erwartet den Slug des Jobs, nicht seinen pk: Der Job Tea Taster bei Leafy gibt /jobs/tea-taster-leafy/ zurück. Lass JobCreateView unverändert.
Veröffentliche einen Job: Du landest auf seiner Seite.
Probier es selbst
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):
# Ein neuer Job erhält einen Slug aus seinem Titel und dem Unternehmen: "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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Klassenbasierte Views
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground