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: GET exibe uma pergunta, e somente o POST do formulário faz a exclusão. 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 formulário com method="post" e {% csrf_token %}. Após a exclusão, não há uma página da linha 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.
Desafio
FácilO template jobs/job_confirm_delete.html está pronto. Crie a página por trás de Delete:
- Uma
JobDeleteView, umaDeleteViewdeJobque redireciona o navegador parajobs:listapós a exclusão. - Uma rota
"jobs/<slug:slug>/delete/"chamadadelete.
Pressione Run, abra uma vaga e pressione Delete; em seguida, confirme.
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"]
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