Menu
CoddyTech

UpdateView

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 12 sur 18.

Les personnes qui publient des offres doivent pouvoir corriger leurs annonces. Modifier une ligne revient à en créer une, sauf que le formulaire est prérempli et que l’enregistrement modifie la ligne au lieu d’en ajouter une. UpdateView fait les deux. Un site de recettes :

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


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

La vue trouve la ligne comme le fait DetailView, à l’aide du pk ou du slug dans l’URL, et renvoie une erreur 404 si aucune ligne ne correspond. Après l’enregistrement, elle redirige vers la même destination que CreateView : success_url ou le get_absolute_url() de la ligne.

Elle partage recipes/recipe_form.html avec CreateView et ajoute la ligne sous le nom object, de sorte que {% if object %} n’est vrai que pendant la modification. fields est obligatoire : Django ne devinera pas quels champs un visiteur peut modifier.

challenge icon

Défi

Facile

Les pages d’offres d’emploi comportent maintenant un lien Edit. Crée la page correspondante :

  • Une JobUpdateView, une UpdateView de Job avec les mêmes cinq champs que JobCreateView.
  • Une route "jobs/<slug:slug>/edit/" nommée edit.

Clique sur Run, ouvre une offre d’emploi, clique sur Edit et enregistre : tu reviens sur l’offre avec ta modification.

Essayez vous-même

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"]

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django