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.
Desafío
FácilCrea la página detrás de Delete, con la plantilla lista jobs/job_confirm_delete.html.
- En
jobs/views.py, añadeJobDeleteView, unaDeleteViewdeJobque redirige el navegador ajobs:listdespués de eliminar. - En
jobs/urls.py, añade la ruta"jobs/<slug:slug>/delete/"llamadadelete.
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"]
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