Votre page d’offres d’emploi
Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 17 sur 18.
Les annonceurs veulent un endroit où retrouver les offres qu’ils ont publiées. Le menu affiche déjà aux utilisateurs connectés un lien Your jobs vers /my-jobs/, mais cette page n’existe pas encore.
À partir d’ici, construis avec ce que cette section t’a appris, sans exemple. La page est une liste, c’est donc une ListView. Ses lignes dépendent de la personne qui en fait la demande : elles sont donc sélectionnées dans get_queryset(), où self.request.user est disponible. Seul un utilisateur connecté a des offres à consulter. Donne-lui son propre modèle : jobs/job_list.html est destiné à la liste publique.
Défi
MoyenDonne à chaque personne qui publie une offre une page avec ses propres offres d’emploi.
- Dans
jobs/views.py, ajouteMyJobsView, réservé aux utilisateurs connectés. Cette vue affiche leurs offres d’emploi, de la plus récente à la plus ancienne, sur une seule page. - Crée
jobs/my_jobs.htmlà partir dejobs/base.html: un<h1>Your jobs, puis un<li class="job">par offre, avec le titre dans<strong>. S’il n’y en a aucune, afficheYou have not posted a job yet. - Dans
jobs/urls.py, ajoutemy-jobs/avec le nommine.
Connecte-toi en tant que ada (coddy-pass-123) et appuie sur Your jobs : tu vois ses 6 offres d’emploi.
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
Toutes les leçons de Vues basées sur des classes
Entraînez-vous par vous-même : Playground Django