Menu
CoddyTech

新しい求人ページにたどり着く

CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 11/18。

求人を投稿すると、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 もそこに遷移します。

challenge icon

チャレンジ

中級

投稿後、ブラウザーには新しい求人のページが表示されるはずです。jobs/models.pyで、JobにページのURL(ルートjobs:detail)を返すget_absolute_url()を定義してください。このルートが受け取るのは求人のslugであり、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):
        # 新しい求人には、title と company から生成された 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)
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

クラスベースビューのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド