채용 정보 검색
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 18번째.
마지막 기능은 채용 공고 페이지의 검색창입니다. 방문자가 developer를 입력하고 검색을 누르면, 제목에 그 단어가 포함된 채용 공고만 표시됩니다.
검색 양식은 GET을 사용하므로 단어가 ?q=developer처럼 URL에 포함되어 링크나 북마크에 저장됩니다. 뷰는 get_queryset()에서 ?city=를 읽는 것과 같은 방식으로 검색어를 읽습니다. 사람들은 대소문자에 관계없이 입력하므로 대소문자를 구분하지 않는 조회를 사용해 일치시킵니다.
필터는 차례로 적용됩니다. 도시가 지정되어 있으면 도시로 범위를 좁힌 다음, 검색어가 있으면 해당 단어로 범위를 좁힙니다. 페이지네이션 링크는 이미 {% querystring %}을 사용하므로 페이지가 바뀌어도 검색어가 유지됩니다.
챌린지
중급/jobs/에 검색 기능을 추가하세요:
- 맨 위에 이름이
q인 입력란과Search버튼이 있는 GET 양식을 만드세요. 입력란에는 검색어가 유지됩니다. ?q=developer는 대소문자에 관계없이 제목에developer가 포함된 일자리를 나열합니다.?q=engineer&city=Berlin은 베를린의 엔지니어 일자리를 나열합니다.
Run을 누르고 developer를 검색하세요.
직접 해보기
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")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
클래스 기반 뷰의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드