Menu
CoddyTech

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. Wenn keine vorhanden ist, 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, deshalb 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 mit kwargs={...} nach Namen oder mit args=[...] der Reihenfolge nach, und importiere reverse aus django.urls. Eine Vorlage kann mit {{ recipe.get_absolute_url }} verlinken, und auch eine UpdateView leitet dorthin weiter.

challenge icon

Aufgabe

Mittel

Nach dem Veröffentlichen sollte der Browser auf der Seite der neuen Stelle landen:

  • Gib Job in jobs/models.py eine Methode get_absolute_url(), die die URL der zugehörigen Seite zurückgibt, also der Route jobs:detail.
  • Lass JobCreateView unverändert.

Klicke auf „Run“ und veröffentliche eine Stelle: Du landest auf ihrer 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 Firmennamen: "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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Klassenbasierte Views

Übe selbstständig: Django-Playground