Переход к новой вакансии
Часть раздела Представления на основе классов путешествия по Django на Coddy. Урок 11 из 18.
Опубликуй вакансию, и Django сохранит её, а затем остановится: No URL to redirect to. После сохранения CreateView перенаправляет на свой success_url. Если он не задан, представление запрашивает у новой строки её адрес с помощью метода модели 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=[...], а reverse импортируй из django.urls. В шаблоне можно создать ссылку с помощью {{ recipe.get_absolute_url }}; туда же перейдёт и UpdateView.
Задание
СреднеПосле публикации браузер должен перейти на страницу новой вакансии. В jobs/models.py добавь для Job метод get_absolute_url(), который возвращает URL её страницы — маршрута jobs:detail. Этот маршрут принимает slug вакансии, а не её pk: вакансия Tea Taster в 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)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Представления на основе классов
4Редактирование представлений
CreateViewПереход к новой вакансии2Универсальные представления для отображения
ListViewDetailViewПотренируйтесь самостоятельно: Песочница Django