Menu
CoddyTech

DeleteView

Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 13 de 18.

As páginas de vagas têm um link Delete. Uma exclusão nunca deve acontecer em uma simples visita: os navegadores e as prévias de links abrem páginas por conta própria. Por isso, DeleteView funciona em duas etapas: uma solicitação GET mostra uma pergunta, e somente a solicitação POST do formulário exclui. Um site de receitas:

from django.urls import reverse_lazy


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

Por padrão, o template é recipes/recipe_confirm_delete.html, um arquivo que você escreve. Ele contém um formulário com method="post" e {% csrf_token %}, e o botão envia a solicitação POST que exclui. Depois da exclusão, não há uma página do registro para a qual retornar, então success_url é obrigatório.

Use reverse_lazy() ali, não reverse(). Um atributo de classe é calculado quando views.py é importado, antes que as rotas existam, então reverse() impede o projeto de iniciar. reverse_lazy() espera até que a URL seja usada.

challenge icon

Desafio

Fácil

Crie a página exibida ao clicar em Delete, usando o template pronto jobs/job_confirm_delete.html.

  1. Em jobs/views.py, adicione JobDeleteView, uma DeleteView de Job que redireciona o navegador para jobs:list após a exclusão.
  2. Em jobs/urls.py, adicione a rota "jobs/<slug:slug>/delete/" com o nome delete.

Clique em Delete em uma vaga: a página pede confirmação primeiro e, ao confirmar, a vaga é removida de /jobs/.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Views baseadas em classes

Pratique por conta própria: Playground de Django