Menu
CoddyTech

Halaman Lowongan Kerjamu

Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 17 dari 18.

Poster menginginkan satu tempat untuk melihat pekerjaan yang mereka posting. Menu sudah menampilkan tautan Your jobs ke /my-jobs/ bagi pengguna yang sudah login, tetapi belum ada yang menanganinya.

Mulai dari sini, kamu membangun dengan materi yang diajarkan di bagian ini, tanpa contoh. Halaman ini berupa list, jadi gunakan ListView. Baris-barisnya bergantung pada siapa yang meminta, jadi baris tersebut dipilih di get_queryset(), tempat self.request.user tersedia. Hanya pengguna yang sudah login yang memiliki pekerjaan untuk dilihat. Berikan template tersendiri: jobs/job_list.html digunakan untuk list publik.

challenge icon

Tantangan

Sedang

Tambahkan /my-jobs/, rute bernama mine:

  • Pengunjung yang belum login akan diarahkan untuk login.
  • Pengguna melihat judul Your jobs dan semua lowongan mereka di satu halaman, dimulai dari yang terbaru, masing-masing di dalam <li class="job"> dengan judul di dalam <strong>.
  • Jika belum ada: You have not posted a job yet.

Tekan Jalankan, login sebagai ada, lalu tekan Your jobs.

Coba sendiri

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

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django