Menu
CoddyTech

DeleteView

Thuộc phần View dựa trên lớp trong hành trình Django của Coddy. Bài học 13 trên 18.

Trang công việc có liên kết Delete. Không bao giờ được xóa khi chỉ truy cập trang: trình duyệt và bản xem trước liên kết có thể tự mở trang. Vì vậy, DeleteView hoạt động theo hai bước: GET hiển thị câu hỏi, và chỉ POST từ biểu mẫu mới thực hiện xóa. Ví dụ về một trang công thức nấu ăn:

from django.urls import reverse_lazy


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

Mẫu này mặc định dùng recipes/recipe_confirm_delete.html, một tệp bạn cần viết. Mẫu có biểu mẫu với method="post" và {% csrf_token %}, cùng nút gửi POST để xóa. Sau khi xóa, không còn trang của bản ghi để chuyển đến, nên cần có success_url.

Hãy dùng reverse_lazy() ở đó, không dùng reverse(). Thuộc tính lớp được tính khi nhập views.py, trước khi các tuyến đường tồn tại, nên reverse() khiến dự án không thể khởi động. reverse_lazy() chờ đến khi URL được dùng.

challenge icon

Thử thách

Dễ

Tạo trang phía sau nút Delete bằng mẫu có sẵn jobs/job_confirm_delete.html.

  1. Trong jobs/views.py, thêm JobDeleteView, một DeleteView của Job để chuyển trình duyệt đến jobs:list sau khi xóa.
  2. Trong jobs/urls.py, thêm tuyến đường "jobs/<slug:slug>/delete/" có tên delete.

Nhấn Delete trên một công việc: trang sẽ hỏi xác nhận trước, và xác nhận sẽ xóa công việc đó khỏi /jobs/.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong View dựa trên lớp

Tự luyện tập: Playground Django