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.
Défi
FacileLes pages d’offres d’emploi comportent maintenant un lien Edit. Crée la page correspondante :
- Une
JobUpdateView, uneUpdateViewdeJobavec les mêmes cinq champs queJobCreateView. - Une route
"jobs/<slug:slug>/edit/"nomméeedit.
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