Trang việc làm của bạn
Thuộc phần View dựa trên lớp trong hành trình Django của Coddy. Bài học 17 trên 18.
Nhà tuyển dụng muốn có một nơi hiển thị các việc làm họ đã đăng. Menu đã hiển thị cho người dùng đã đăng nhập liên kết Your jobs đến /my-jobs/, nhưng trang đó vẫn chưa tồn tại.
Từ đây, bạn tự xây dựng dựa trên những gì phần này đã dạy, không cần ví dụ. Trang này là một danh sách, nên đây là ListView. Các hàng phụ thuộc vào người đang truy cập, vì vậy hãy chọn chúng trong get_queryset(), nơi có sẵn self.request.user. Chỉ người dùng đã đăng nhập mới có việc làm để xem. Tạo một mẫu riêng cho trang này: jobs/job_list.html dành cho danh sách công khai.
Thử thách
Trung bìnhTạo cho mỗi người đăng bài một trang riêng để xem các công việc của họ.
- Trong
jobs/views.py, thêmMyJobsView, chỉ dành cho người dùng đã đăng nhập. Trang này liệt kê các công việc của họ, công việc mới nhất ở đầu, trên cùng một trang. - Tạo
jobs/my_jobs.htmltừjobs/base.html: một thẻ<h1>có nội dungYour jobs, sau đó là một thẻ<li class="job">cho mỗi công việc, với tiêu đề nằm trong<strong>. Nếu không có công việc nào, hiển thịYou have not posted a job yet. - Trong
jobs/urls.py, thêmmy-jobs/với tênmine.
Đăng nhập bằng ada (coddy-pass-123) rồi nhấn Your jobs: bạn sẽ thấy 6 công việc của cô ấy.
Tự làm thử
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, DeleteView, 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(LoginRequiredMixin, CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def form_valid(self, form):
form.instance.posted_by = self.request.user
return super().form_valid(form)
class JobUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def test_func(self):
return self.get_object().posted_by == self.request.user
class JobDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
def test_func(self):
return self.get_object().posted_by == self.request.user
Tất cả bài học trong View dựa trên lớp
Tự luyện tập: Playground Django