Menu
CoddyTech

Strona nowego ogłoszenia o pracę

Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 11 z 18.

Opublikuj ofertę pracy, a Django ją zapisze, po czym się zatrzyma: No URL to redirect to. Po zapisaniu obiekt CreateView przekierowuje pod adres z success_url. Jeśli go nie ma, prosi nowy wiersz o jego adres za pomocą metody modelu, get_absolute_url().

Adres strony wiersza zależy od tego wiersza, dlatego metoda należy do modelu. Utwórz go za pomocą reverse(), które zamienia nazwę trasy i argumenty na URL, tak jak robi to {% url %} w szablonie:

class Recipe(models.Model):
    ...

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

Podaj argumenty po nazwach za pomocą kwargs={...} lub w kolejności za pomocą args=[...], a następnie zaimportuj reverse z django.urls. Szablon może utworzyć link za pomocą {{ recipe.get_absolute_url }}, a UpdateView również kieruje pod ten adres.

challenge icon

Wyzwanie

Średni

Po opublikowaniu przeglądarka powinna przejść na stronę nowej oferty pracy. W pliku jobs/models.py dodaj do Job metodę get_absolute_url(), która zwraca adres URL jego strony, czyli trasę jobs:detail. Ta trasa przyjmuje slug oferty, a nie jej pk: oferta Tea Taster w firmie Leafy zwraca /jobs/tea-taster-leafy/. Pozostaw JobCreateView bez zmian.

Opublikuj ofertę pracy: trafisz na jej stronę.

Spróbuj swoich sił

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):
        # Nowa oferta pracy otrzymuje slug na podstawie tytułu i nazwy firmy: "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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Widoki oparte na klasach

Poćwicz samodzielnie: Edytor online Django