Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Crea la pagina dietro Post a job usando il template già pronto jobs/job_form.html.

  1. In jobs/views.py, aggiungi JobCreateView, una CreateView di Job con i campi title, company, city, salary e description.
  2. In jobs/urls.py, aggiungi il percorso "jobs/new/" chiamato create.

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