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.
Défi
FacileLes pages d’offres d’emploi ont maintenant un lien Edit. Créez la page correspondante.
- Dans
jobs/views.py, ajoutezJobUpdateView, uneUpdateViewdeJobavec les mêmes cinq champs queJobCreateView. - Dans
jobs/urls.py, ajoutez la route"jobs/<slug:slug>/edit/"nomméeedit.
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