Menu
CoddyTech

Arrivare alla nuova offerta di lavoro

Fa parte della sezione View basate su classi del percorso Django di Coddy. Lezione 11 di 18.

Pubblica un annuncio di lavoro e Django lo salva, poi si ferma: No URL to redirect to. Dopo averlo salvato, una CreateView reindirizza al suo success_url. Se non è specificato, chiede alla nuova riga il suo indirizzo tramite un metodo del modello, get_absolute_url().

L’indirizzo della pagina di una riga dipende dalla riga stessa, quindi il metodo appartiene al modello. Crealo con reverse(), che trasforma il nome e gli argomenti di una route in un URL, proprio come fa {% url %} in un template:

class Recipe(models.Model):
    ...

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

Passa gli argomenti per nome con kwargs={...}, oppure in ordine con args=[...], e importa reverse da django.urls. Un template può creare un link con {{ recipe.get_absolute_url }}, e anche una UpdateView porta a quell’indirizzo.

challenge icon

Sfida

Medio

Dopo aver pubblicato un annuncio, il browser dovrebbe aprire la pagina del nuovo annuncio. In jobs/models.py, assegna a Job un metodo get_absolute_url() che restituisca l'URL della sua pagina, la route jobs:detail. Questa route accetta lo slug dell'annuncio, non il suo pk: l'annuncio Tea Taster presso Leafy restituisce /jobs/tea-taster-leafy/. Lascia JobCreateView così com'è.

Pubblica un annuncio: atterri sulla sua pagina.

Provalo tu

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):
        # Un nuovo annuncio di lavoro ottiene uno slug dal suo titolo e dalla sua azienda: "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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di View basate su classi

Esercitati da solo: Playground Django