新しい求人ページにたどり着く
CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 11/18。
求人を投稿すると、Djangoは保存しますが、その後は何もせず、「リダイレクト先のURLがありません」と表示します。保存後、CreateViewはそのsuccess_urlへリダイレクトします。指定されていない場合は、新しい行のモデルメソッドget_absolute_url()を使って、その行のURLを取得します。
行のページのURLは行ごとに異なるため、このメソッドはモデルに定義します。reverse()を使って作成します。これは、テンプレートでの{% url %}と同様に、ルート名と引数から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()を定義します。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プレイグラウンド