Menu
CoddyTech

UpdateView

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

Chi pubblica ricette deve poterle modificare. Modificare una riga equivale a crearne una, tranne per il fatto che il modulo è già compilato e il salvataggio modifica la riga invece di aggiungerne una. UpdateView fa entrambe le cose. Un sito di ricette:

class RecipeUpdateView(UpdateView):
    model = Recipe
    fields = ["title", "cuisine", "minutes"]


# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")

Trova la riga come fa DetailView, usando il pk o lo slug nell’URL, e restituisce un errore 404 se non ne trova nessuna. Dopo il salvataggio, porta alla stessa destinazione di CreateView: success_url oppure get_absolute_url() della riga.

Condivide recipes/recipe_form.html con CreateView e aggiunge la riga come object, quindi {% if object %} è vero solo durante la modifica. fields è obbligatorio: Django non indovinerà quali campi un visitatore può modificare.

challenge icon

Sfida

Facile

Le pagine degli annunci ora hanno un link Edit. Crea la pagina a cui conduce:

  • Una JobUpdateView, una UpdateView di Job con gli stessi cinque campi di JobCreateView.
  • Una route "jobs/<slug:slug>/edit/" chiamata edit.

Premi Run, apri un annuncio, premi Edit e salva: tornerai alla pagina dell’annuncio con la modifica apportata.

Provalo tu

from django.views.generic import CreateView, 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


class JobCreateView(CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]

Tutte le lezioni di View basate su classi

Esercitati da solo: Playground Django