Menu
CoddyTech

DeleteView

Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 13 de 18.

Las páginas de empleos tienen un enlace Delete. Nunca debe realizarse una eliminación al visitar una página sin más: los navegadores y las vistas previas de enlaces abren páginas por su cuenta. Por eso, DeleteView funciona en dos pasos: GET muestra una pregunta y solo el POST de su formulario elimina el elemento. Un sitio de recetas:

from django.urls import reverse_lazy


class RecipeDeleteView(DeleteView):
    model = Recipe
    success_url = reverse_lazy("recipes:home")

Su plantilla predeterminada es recipes/recipe_confirm_delete.html, un archivo que debes crear. Contiene un formulario con method="post" y {% csrf_token %}, y su botón envía el POST que realiza la eliminación. Después de eliminar el elemento, no hay una página de fila a la que volver, así que success_url es obligatorio.

Usa reverse_lazy() ahí, no reverse(). Un atributo de clase se calcula cuando se importa views.py, antes de que existan las rutas, así que reverse() impide que se inicie el proyecto. reverse_lazy() espera hasta que se use la URL.

challenge icon

Desafío

Fácil

Crea la página detrás de Delete, con la plantilla lista jobs/job_confirm_delete.html.

  1. En jobs/views.py, añade JobDeleteView, una DeleteView de Job que redirige el navegador a jobs:list después de eliminar.
  2. En jobs/urls.py, añade la ruta "jobs/<slug:slug>/delete/" llamada delete.

Pulsa Delete en una oferta de empleo: la página pregunta primero y, al confirmar, la elimina de /jobs/.

Pruébalo tú mismo

from django.views.generic import CreateView, DetailView, ListView, TemplateView, UpdateView

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"]


class JobUpdateView(UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django