Menu
CoddyTech

Переход к новой вакансии

Часть раздела Представления на основе классов путешествия по 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 тоже перенаправит туда.

challenge icon

Задание

Средне

После публикации браузер должен открыть страницу новой вакансии:

  • В jobs/models.py добавь в Job метод get_absolute_url(), который возвращает URL её страницы — маршрут jobs:detail.
  • Оставь 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 на основе своего названия и компании: "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