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.
Défi
MoyenAjoutez une recherche à /jobs/ :
- Un formulaire GET en haut, avec un champ nommé
qet un boutonSearch. Le champ conserve le mot recherché. ?q=developeraffiche les emplois dont le titre contientdeveloper, sans distinction de casse.?q=engineer&city=Berlinaffiche 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")
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