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.
Défi
MoyenAjoute une barre de recherche d’offres d’emploi.
- Dans
jobs/views.py, dansJobListView.get_queryset(), lisqdepuisrequest.GETde la même manière quecity. Lorsqu’il est défini, ne conserve que les offres dont le titre le contient, sans tenir compte de la casse. - Dans
job_list.html, sous<h1>, ajoute un formulaire GET : un champ nomméqdont la valeur estrequest.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")
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