Menu
CoddyTech

Recherche d’emploi

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 18 sur 18.

La dernière fonctionnalité est une barre de recherche sur la page des emplois. Un visiteur saisit developer, appuie sur « Rechercher » et ne voit que les emplois dont le titre contient ce mot.

Un formulaire de recherche utilise GET : le mot apparaît donc dans l’URL sous la forme ?q=developer, qui est conservée dans un lien ou un favori. La vue le lit comme elle lit ?city=, dans get_queryset(). Les gens saisissent du texte avec des majuscules ou des minuscules : utilisez donc une recherche qui ne tient pas compte de la casse.

Dans un modèle, la requête actuelle est request ; {{ request.GET.q }} correspond donc au mot recherché : placez-le dans la valeur du champ.

Les filtres s’enchaînent : restreignez les résultats par ville lorsqu’il y en a une, puis par mot lorsqu’il y en a un. Les liens de pagination utilisent déjà {% querystring %} ; la recherche est donc conservée lors du changement de page.

challenge icon

Défi

Moyen

Ajoute une barre de recherche d’offres d’emploi.

  1. Dans jobs/views.py, dans JobListView.get_queryset(), lis q depuis request.GET de la même manière que city. Lorsqu’il est défini, ne conserve que les offres dont le titre le contient, sans tenir compte de la casse.
  2. Dans job_list.html, sous <h1>, ajoute un formulaire GET : un champ nommé q dont la valeur est request.GET.q, ainsi qu’un bouton « Search ».

Recherche developer : tu vois 4 offres et le champ conserve le mot.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django