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 offres d’emploi. Un visiteur saisit developer, appuie sur Rechercher et ne voit que les offres contenant ce mot dans le titre.

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

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

challenge icon

Défi

Moyen

Ajoutez une recherche à /jobs/ :

  • Un formulaire GET en haut, avec un champ nommé q et un bouton Search. Le champ conserve le mot recherché.
  • ?q=developer affiche les emplois dont le titre contient developer, sans distinction de casse.
  • ?q=engineer&city=Berlin affiche les emplois d’ingénieur à Berlin.

Cliquez sur Run et recherchez developer.

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