Strona nowego ogłoszenia o pracę
Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 11 z 18.
Dodajesz ofertę pracy, a Django ją zapisuje, po czym się zatrzymuje: No URL to redirect to. Po zapisaniu widok CreateView przekierowuje pod adres z success_url. Jeśli go nie ma, pyta nowy wiersz o jego adres za pomocą metody modelu, get_absolute_url().
Adres strony wiersza zależy od tego wiersza, więc ta metoda należy do modelu. Zbuduj adres za pomocą reverse(), która 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})Przekaż argumenty nazwami za pomocą kwargs={...} albo po kolei za pomocą args=[...], a następnie zaimportuj reverse z django.urls. Szablon może utworzyć odnośnik za pomocą {{ recipe.get_absolute_url }}, a widok UpdateView również przekieruje pod ten adres.
Wyzwanie
ŚredniPo opublikowaniu przeglądarka powinna przejść na stronę nowego ogłoszenia:
- W pliku
jobs/models.pydodaj doJobmetodęget_absolute_url(), która zwraca adres URL strony tego ogłoszenia, czyli trasęjobs:detail. - Pozostaw
JobCreateViewbez zmian.
Naciśnij Run i opublikuj ogłoszenie: przejdziesz na jego 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)
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
4Widoki edycji
CreateViewStrona nowego ogłoszenia o pracę2Generyczne widoki wyświetlania
ListViewDetailViewPoćwicz samodzielnie: Edytor online Django