Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Tạo cho mỗi người đăng bài một trang riêng để xem các công việc của họ.

  1. Trong jobs/views.py, thêm MyJobsView, 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.
  2. Tạo jobs/my_jobs.html từ jobs/base.html: một thẻ <h1> có nội dung Your 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.
  3. Trong jobs/urls.py, thêm my-jobs/ với tên mine.

Đă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