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 il salvataggio, una CreateView reindirizza al suo success_url. Se non è definito, 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. Costruiscilo 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 collegamento con {{ recipe.get_absolute_url }}, e anche una UpdateView porta lì.
Sfida
MedioDopo aver pubblicato un'offerta, il browser dovrebbe aprire la pagina della nuova offerta:
- In
jobs/models.py, aggiungi aJobun metodoget_absolute_url()che restituisce l'URL della sua pagina, la routejobs:detail. - Lascia
JobCreateViewcosì com'è.
Premi Run e pubblica un'offerta: si aprirà la 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):
# Una nuova offerta di lavoro ottiene uno slug dal suo titolo e dall'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)
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
4Viste di modifica
CreateViewArrivare alla nuova offerta di lavoroEsercitati da solo: Playground Django