进入新职位页面
本课属于 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 也会跳转到那里。
挑战
中等发布后,浏览器应跳转到新职位的页面。在 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)
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基于类的视图中的所有课
自己练习: Django 在线编辑器