UpdateView
Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 12 de 18.
Quienes publican necesitan corregir sus trabajos. Editar una fila es como crear una, salvo que el formulario aparece rellenado y al guardar se modifica la fila en lugar de añadir una. UpdateView hace ambas cosas. Un sitio de recetas:
class RecipeUpdateView(UpdateView):
model = Recipe
fields = ["title", "cuisine", "minutes"]
# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")Encuentra la fila del mismo modo que DetailView, mediante el pk o el slug de la URL, y responde con un error 404 si no hay ninguna. Después de guardar, va al mismo lugar que CreateView: success_url o el get_absolute_url() de la fila.
Comparte recipes/recipe_form.html con CreateView y añade la fila como object, por lo que {% if object %} es verdadero solo cuando se está editando. fields es obligatorio: Django no adivinará qué campos puede cambiar un visitante.
Desafío
FácilLas páginas de empleos ahora tienen un enlace Edit. Crea la página a la que lleva:
- Una
JobUpdateView, unaUpdateViewdeJobcon los mismos cinco campos queJobCreateView. - Una ruta
"jobs/<slug:slug>/edit/"llamadaedit.
Pulsa Run, abre un empleo, pulsa Edit y guarda: volverás a la página del empleo con tu cambio.
Pruébalo tú mismo
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"]
Todas las lecciones de Vistas basadas en clases
Practica por tu cuenta: Playground de Django