Menu
CoddyTech

DeleteView

Часть раздела Представления на основе классов путешествия по Django на Coddy. Урок 13 из 18.

На страницах вакансий есть ссылка Delete. Удаление не должно происходить при обычном посещении страницы: браузеры и предпросмотр ссылок открывают страницы сами. Поэтому DeleteView работает в два этапа: GET отображает вопрос, и только POST-запрос из формы удаляет запись. Сайт с рецептами:

from django.urls import reverse_lazy


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

По умолчанию шаблон называется recipes/recipe_confirm_delete.html; этот файл нужно создать. В нём есть форма с method="post" и {% csrf_token %}, а её кнопка отправляет POST-запрос, который удаляет запись. После удаления страницы записи уже нет, поэтому требуется success_url.

Используй там reverse_lazy(), а не reverse(). Атрибут класса вычисляется при импорте views.py, до того как появляются маршруты, поэтому reverse() не даёт проекту запуститься. reverse_lazy() ждёт, пока URL понадобится.

challenge icon

Задание

Легко

Создай страницу, которая открывается после нажатия Delete, используя готовый шаблон jobs/job_confirm_delete.html.

  1. В jobs/views.py добавь JobDeleteView — представление DeleteView для Job, которое после удаления перенаправляет браузер на jobs:list.
  2. В jobs/urls.py добавь маршрут "jobs/<slug:slug>/delete/" с именем delete.

Нажми Delete у вакансии: сначала страница запросит подтверждение, а после подтверждения вакансия будет удалена из /jobs/.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Представления на основе классов

Потренируйтесь самостоятельно: Песочница Django