새 구인 게시물 등록하기
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 11번째.
구인 공고를 게시하면 Django는 이를 저장한 뒤 멈춥니다. No URL to redirect to. 저장 후 CreateView는 success_url로 리디렉션합니다. 이를 지정하지 않으면 새 행에 주소를 묻기 위해 모델 메서드인 get_absolute_url()을 호출합니다.
행의 페이지 주소는 행에 따라 달라지므로 이 메서드는 모델에 속합니다. 템플릿에서 {% url %}이 하는 것처럼 경로 이름과 인수를 URL로 바꾸는 reverse()를 사용해 주소를 만드세요.
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()을 추가하세요.JobCreateView는 그대로 두세요.
Run을 누르고 채용 공고를 게시하세요. 해당 페이지로 이동합니다.
직접 해보기
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는 title과 company에서 생성됩니다: "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 플레이그라운드