Menu
CoddyTech

Pencarian Kerja

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

Fitur terakhir adalah kotak pencarian di halaman lowongan kerja. Pengunjung mengetik developer, menekan tombol “Cari”, lalu hanya melihat lowongan kerja yang judulnya memuat kata tersebut.

Formulir pencarian menggunakan GET, jadi kata tersebut muncul di URL sebagai ?q=developer, sehingga tetap tersimpan saat tautan disimpan atau ditandai. View membacanya seperti membaca ?city=, di get_queryset(). Orang mengetik dengan huruf besar atau kecil, jadi cocokkan dengan pencarian yang mengabaikan perbedaan huruf besar-kecil.

Dalam template, request saat ini adalah request, jadi {{ request.GET.q }} adalah kata yang dicari: masukkan kata tersebut sebagai nilai kotak pencarian.

Filter dirangkai: persempit hasil berdasarkan kota jika ada, lalu berdasarkan kata jika ada. Tautan paginasi sudah menggunakan {% querystring %}, jadi pencarian tetap ada saat berpindah halaman.

challenge icon

Tantangan

Sedang

Tambahkan kotak pencarian lowongan kerja.

  1. Di jobs/views.py, di JobListView.get_queryset(), ambil q dari request.GET dengan cara yang sama seperti city. Jika nilainya tersedia, tampilkan hanya lowongan yang judulnya memuat nilai tersebut, tanpa membedakan huruf besar dan kecil.
  2. Di job_list.html, di bawah <h1>, tambahkan formulir GET: kotak bernama q yang nilainya adalah request.GET.q, dan tombol Search.

Cari developer: kamu melihat 4 lowongan dan kotak pencarian tetap menampilkan kata tersebut.

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


class MyJobsView(LoginRequiredMixin, ListView):
    template_name = "jobs/my_jobs.html"
    context_object_name = "jobs"

    def get_queryset(self):
        return Job.objects.filter(posted_by=self.request.user).order_by("-posted")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django