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، أضف نموذج GET أسفل <h1>: مربعًا اسمه q وقيمته request.GET.q، وزرًا بعنوان «بحث».

ابحث عن 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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس واجهات العرض المعتمدة على الأصناف

تدرّب بنفسك: Playground لـ Django