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.
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.
- Trong
jobs/views.py, thêmJobDeleteView, mộtDeleteViewcủaJobđể chuyển trình duyệt đếnjobs:listsau khi xóa. - Trong
jobs/urls.py, thêm tuyến đường"jobs/<slug:slug>/delete/"có têndelete.
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"]
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