البحث عن وظيفة
جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة 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")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات العرض المعتمدة على الأصناف
تدرّب بنفسك: Playground لـ Django