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.
Desafío
FácilLa plantilla jobs/job_confirm_delete.html está lista. Crea la página que se muestra al pulsar Delete:
- Una
JobDeleteView, unaDeleteViewdeJobque redirija el navegador ajobs:listdespués de eliminar. - Una ruta
"jobs/<slug:slug>/delete/"llamadadelete.
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"]
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