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: el formulario aparece ya 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 igual que DetailView, mediante el pk o el slug de la URL, y responde con un 404 cuando ninguna fila coincide. Después de guardar, va adonde va 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, de modo que {% if object %} sea verdadero solo al editar. fields es obligatorio: Django no adivinará qué campos puede modificar un visitante.
Desafío
FácilLas páginas de empleos ahora tienen un enlace Edit. Crea la página que hay detrás.
- En
jobs/views.py, añadeJobUpdateView, unaUpdateViewdeJobcon los mismos cinco campos queJobCreateView. - En
jobs/urls.py, añade la ruta"jobs/<slug:slug>/edit/"con el nombreedit.
Abre un empleo, pulsa «Editar» y guarda: volverás al empleo con el cambio aplicado.
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