Yeni İş İlanına Geçiş
Coddy'nin Django Journey'sinin Sınıf Tabanlı Görünümler bölümünün bir parçası. Ders 11 / 18.
Bir iş ilanı yayımlarsın ve Django onu kaydeder, sonra durur: No URL to redirect to. Kaydettikten sonra bir CreateView, success_url adresine yönlendirir. Böyle bir adres yoksa yeni satıra adresini bir model yöntemi aracılığıyla sorar: get_absolute_url().
Bir satırın sayfasının adresi satıra bağlıdır, bu nedenle yöntem modele aittir. Bir rotanın adını ve bağımsız değişkenlerini bir URL'ye dönüştüren reverse() ile bu adresi oluştur; şablonda {% url %} de bunu yapar:
class Recipe(models.Model):
...
def get_absolute_url(self):
return reverse("recipes:recipe", kwargs={"pk": self.pk})Bağımsız değişkenleri kwargs={...} ile adlarına göre veya args=[...] ile sırayla ver ve reverse işlevini django.urls içinden içe aktar. Bir şablon {{ recipe.get_absolute_url }} ile bağlantı verebilir; bir UpdateView de oraya yönlendirilir.
Görev
Ortaİlanı gönderdikten sonra tarayıcı yeni işin sayfasını açmalıdır. jobs/models.py dosyasında Job sınıfına, sayfasının URL'sini döndüren bir get_absolute_url() yöntemi ekle; bu URL jobs:detail rotasıdır. Bu rota işin pk değerini değil, slug değerini alır: Leafy'deki Çay Tadımcısı işi /jobs/tea-taster-leafy/ adresini döndürür. JobCreateView sınıfını olduğu gibi bırak.
Bir iş ilanı gönder: sayfasına yönlendirilirsin.
Kendin dene
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):
# Yeni bir iş ilanı, başlığından ve şirket adından bir slug alır: "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)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Sınıf Tabanlı Görünümler bölümündeki tüm dersler
4Düzenleme Görünümleri
Oluşturma GörünümüYeni İş İlanına GeçişKendi başına pratik yap: Django playground