Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Las páginas de empleos ahora tienen un enlace Edit. Crea la página a la que lleva:

  • Una JobUpdateView, una UpdateView de Job con los mismos cinco campos que JobCreateView.
  • Una ruta "jobs/<slug:slug>/edit/" llamada edit.

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