Menu
CoddyTech

채용 정보 검색

Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 18번째.

마지막 기능은 채용 공고 페이지의 검색 상자입니다. 방문자가 developer를 입력하고 ‘검색’을 누르면 제목에 그 단어가 포함된 채용 공고만 표시됩니다.

검색 양식은 GET을 사용하므로 단어가 ?q=developer와 같이 URL에 들어가며, 링크나 북마크로 저장할 수 있습니다. 뷰는 get_queryset()에서 ?city=를 읽는 것처럼 검색어를 읽습니다. 사람들은 대소문자를 구분하지 않고 입력하므로, 대소문자를 무시하는 조회를 사용해 일치시킵니다.

템플릿에서 현재 요청은 request이므로 {{ request.GET.q }}가 검색어입니다. 이를 검색 상자의 값으로 넣으세요.

필터는 이어서 적용됩니다. 도시가 있으면 도시로 범위를 좁힌 다음, 검색어가 있으면 그 단어로 범위를 좁힙니다. 페이지네이션 링크는 이미 {% querystring %}을 사용하므로 페이지를 바꾸어도 검색어가 유지됩니다.

challenge icon

챌린지

중급

채용 공고 검색 상자를 추가하세요.

  1. jobs/views.py의 JobListView.get_queryset()에서 city와 같은 방식으로 request.GET에서 q를 읽으세요. 값이 설정되어 있으면 대소문자를 구분하지 않고 제목에 해당 값이 포함된 채용 공고만 남기세요.
  2. job_list.html에서 <h1> 아래에 GET 폼을 추가하세요. 이름이 q이고 값이 request.GET.q인 입력 상자와 Search 버튼을 넣으세요.

developer를 검색하세요. 채용 공고 4개가 표시되고 입력 상자에는 검색어가 그대로 남습니다.

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

클래스 기반 뷰의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드