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: 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.

challenge icon

Desafío

Fácil

Las páginas de empleos ahora tienen un enlace Edit. Crea la página que hay detrás.

  1. En jobs/views.py, añade JobUpdateView, una UpdateView de Job con los mismos cinco campos que JobCreateView.
  2. En jobs/urls.py, añade la ruta "jobs/<slug:slug>/edit/" con el nombre edit.

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