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. El borrado nunca debe ocurrir con una simple visita: 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 realiza el borrado. 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 formulario con method="post" y {% csrf_token %}. Después del borrado no hay una página de la fila a la que ir, 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 el proyecto se inicie. reverse_lazy() espera hasta que se use la URL.

challenge icon

Desafío

Fácil

La plantilla jobs/job_confirm_delete.html está lista. Crea la página que se muestra al pulsar Delete:

  • Una JobDeleteView, una DeleteView de Job que redirija el navegador a jobs:list después de eliminar.
  • Una ruta "jobs/<slug:slug>/delete/" llamada delete.

Pulsa Run, abre un empleo y pulsa Delete; después, confirma.

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