새 구인 게시물 등록하기
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 11번째.
채용 공고를 게시하면 Django가 저장한 뒤 멈춥니다. No URL to redirect to. 저장한 뒤 CreateView는 success_url로 리디렉션합니다. 이 값이 없으면 새 행에 모델 메서드 get_absolute_url()을 통해 주소를 요청합니다.
행 페이지의 주소는 행에 따라 달라지므로 이 메서드는 모델에 속합니다. 경로 이름과 인수를 URL로 바꿔 주는 reverse()로 주소를 만드세요. 템플릿에서 {% url %}을 사용하는 것과 같습니다.
class Recipe(models.Model):
...
def get_absolute_url(self):
return reverse("recipes:recipe", kwargs={"pk": self.pk})kwargs={...}로 이름을 지정해 인수를 전달하거나 args=[...]로 순서대로 전달하고, django.urls에서 reverse를 가져오세요. 템플릿에서는 {{ recipe.get_absolute_url }}로 링크할 수 있고, UpdateView도 해당 주소로 이동합니다.
챌린지
중급게시한 후 브라우저에는 새 채용 공고 페이지가 표시되어야 합니다. jobs/models.py에서 Job에 해당 페이지의 URL인 jobs:detail 경로를 반환하는 get_absolute_url()을 추가하세요. 이 경로는 pk가 아니라 채용 공고의 슬러그를 사용합니다. Leafy의 Tea Taster 채용 공고는 /jobs/tea-taster-leafy/를 반환합니다. JobCreateView는 그대로 두세요.
채용 공고를 게시하면 해당 페이지로 이동합니다.
직접 해보기
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):
# 새 채용 공고의 slug는 제목과 회사 이름을 바탕으로 생성됩니다: "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)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
클래스 기반 뷰의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드