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 annonceurs doivent pouvoir corriger leurs offres d’emploi. Modifier une ligne, c’est en créer une, sauf que le formulaire est déjà 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")

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

Il partage recipes/recipe_form.html avec CreateView et ajoute la ligne sous le nom object, de sorte que {% if object %} soit vrai uniquement lors de 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 ont maintenant un lien Edit. Créez la page correspondante.

  1. Dans jobs/views.py, ajoutez JobUpdateView, une UpdateView de Job avec les mêmes cinq champs que JobCreateView.
  2. Dans jobs/urls.py, ajoutez la route "jobs/<slug:slug>/edit/" nommée edit.

Ouvrez une offre d’emploi, cliquez sur Edit et enregistrez : vous revenez à l’offre avec votre 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