Menu
CoddyTech

进入新职位页面

本课属于 Coddy Django 学习旅程的“基于类的视图”单元。第 11 课,共 18 课。

发布一条职位信息后,Django 会保存它,然后就停住了:No URL to redirect to。保存后,CreateView 会重定向到它的 success_url。如果没有设置,Django 会通过模型方法 get_absolute_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 也会跳转到那里。

challenge icon

挑战

中等

发布后,浏览器应跳转到新职位的页面。在 jobs/models.py 中,为 Job 添加一个 get_absolute_url(),使其返回职位页面的 URL,即路由 jobs:detail。该路由接收职位的 slug,而不是 pk:Leafy 的品茶师职位返回 /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)
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基于类的视图中的所有课

自己练习: Django 在线编辑器