CreateView
Fa parte della sezione View basate su classi del percorso Django di Coddy. Lezione 10 di 18.
Il menu contiene un link Post a job senza una pagina associata. Una pagina che aggiunge una riga usa sempre lo stesso codice: mostrare un modulo vuoto, controllare cosa è stato inviato, salvarlo e reindirizzare. CreateView è quel codice e crea per te un ModelForm:
from django.views.generic import CreateView
class RecipeCreateView(CreateView):
model = Recipe
fields = ["title", "cuisine", "minutes"]fields elenca i campi del modulo, come Meta di un ModelForm. Il modello predefinito è recipes/recipe_form.html, con il modulo disponibile come form. Se i dati non sono validi, il modulo viene mostrato di nuovo con i relativi errori e non viene salvato nulla.
Inserisci la route "recipes/new/" prima di "recipes/<slug:slug>/". Django usa la prima route corrispondente. new è uno slug valido, quindi una route per gli slug inserita prima intercetta /recipes/new/ e restituisce 404.
Sfida
MedioCrea la pagina dietro Post a job usando il template già pronto jobs/job_form.html.
- In
jobs/views.py, aggiungiJobCreateView, unaCreateViewdiJobcon i campititle,company,city,salaryedescription. - In
jobs/urls.py, aggiungi il percorso"jobs/new/"chiamatocreate.
Pubblica un annuncio di lavoro: viene salvato, poi Django si ferma con No URL to redirect to, un problema che verrà risolto nella prossima lezione.
Provalo tu
from django.views.generic import DetailView, ListView, TemplateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
paginate_by = 5
def get_queryset(self):
jobs = super().get_queryset()
city = self.request.GET.get("city")
if city:
jobs = jobs.filter(city=city)
return jobs
class JobDetailView(DetailView):
model = Job
Tutte le lezioni di View basate su classi
Esercitati da solo: Playground Django