חיפוש משרות
חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-Django של Coddy. שיעור 18 מתוך 18.
התכונה האחרונה היא תיבת חיפוש בדף המשרות. מבקר מקליד developer, לוחץ על חיפוש ורואה רק את המשרות שהמילה הזאת מופיעה בכותרת שלהן.
טופס חיפוש משתמש ב-GET, כך שהמילה מופיעה בכתובת ה-URL בתור ?q=developer, שם היא נשמרת בקישור או בסימנייה. התצוגה קוראת אותה כמו שהיא קוראת את ?city=, בתוך get_queryset(). אנשים מקלידים באותיות גדולות או קטנות, לכן יש להתאים באמצעות חיפוש שמתעלם מההבדל ביניהן.
אפשר לשרשר מסננים: לצמצם לפי עיר כשיש כזאת, ואז לפי המילה כשיש כזאת. קישורי העימוד כבר משתמשים ב-{% querystring %}, ולכן החיפוש נשמר במעבר בין הדפים.
אתגר
בינוניהוסיפו חיפוש אל /jobs/:
- טופס GET בראש העמוד עם שדה בשם
qוכפתורSearch. השדה שומר את המילה שחיפשתם. ?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 אונליין