Menu
CoddyTech

Acessando a nova vaga

Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 11 de 18.

Publique uma vaga e o Django a salva, mas para por aí: No URL to redirect to. Depois de salvar, uma CreateView redireciona para seu success_url. Sem um, ela pede o endereço da nova linha por meio de um método do modelo, get_absolute_url().

O endereço da página de uma linha depende da própria linha, então o método pertence ao modelo. Crie-o com reverse(), que transforma o nome e os argumentos de uma rota em uma URL, assim como {% url %} faz em um template:

class Recipe(models.Model):
    ...

    def get_absolute_url(self):
        return reverse("recipes:recipe", kwargs={"pk": self.pk})

Forneça os argumentos nomeados com kwargs={...} ou em ordem com args=[...], e importe reverse de django.urls. Um template pode criar um link com {{ recipe.get_absolute_url }}, e uma UpdateView também redireciona para lá.

challenge icon

Desafio

Médio

Após publicar, o navegador deve abrir a página da nova vaga:

  • Em jobs/models.py, adicione a Job um método get_absolute_url() que retorne a URL da página dela, a rota jobs:detail.
  • Deixe JobCreateView como está.

Clique em Run e publique uma vaga: você será levado à página dela.

Experimente você mesmo

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):
        # Uma nova vaga recebe um slug gerado a partir do título e da empresa: "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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Views baseadas em classes

Pratique por conta própria: Playground de Django