Menu
CoddyTech

חיפוש משרות

חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-Django של Coddy. שיעור 18 מתוך 18.

התכונה האחרונה היא תיבת חיפוש בדף המשרות. מבקר מקליד developer, לוחץ על "חיפוש" ורואה רק את המשרות שהמילה הזאת מופיעה בכותרת שלהן.

טופס חיפוש משתמש ב-GET, כך שהמילה מופיעה בכתובת ה-URL בתור ?q=developer, וקישור או סימנייה שומרים אותה. התצוגה קוראת אותה כפי שהיא קוראת את ?city=, בתוך get_queryset(). אנשים מקלידים באותיות גדולות או קטנות, לכן יש לבצע התאמה בחיפוש שאינו מבחין ביניהן.

בתבנית הבקשה הנוכחית היא request, ולכן {{ request.GET.q }} היא המילה שחיפשו: הצב אותה בערך של תיבת החיפוש.

מסננים משורשרים: מצמצמים לפי עיר כשיש כזאת, ואז לפי המילה כשיש כזאת. קישורי העימוד כבר משתמשים ב-{% querystring %}, כך שהחיפוש נשמר במעבר בין דפים.

challenge icon

אתגר

בינוני

הוסף תיבת חיפוש למשרות.

  1. ב־jobs/views.py, בתוך JobListView.get_queryset(), קרא את q מתוך request.GET באותו אופן כמו city. כשהוא מוגדר, השאר רק משרות שהכותרת שלהן מכילה אותו, ללא הבחנה בין אותיות רישיות לקטנות.
  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 אונליין