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 seul 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 rien ne lui correspond encore.
À partir de là, construis la page avec ce que cette section t’a appris, sans exemple. La page est une liste, donc c’est une ListView. Ses lignes dépendent de la personne qui la consulte, elles sont donc choisies 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 celui de la liste publique.
Défi
MoyenAjoutez /my-jobs/, une route nommée mine :
- Les visiteurs non connectés sont redirigés vers la page de connexion.
- Un utilisateur voit le titre
Your jobset toutes ses offres d’emploi sur une seule page, de la plus récente à la plus ancienne, chacune dans<li class="job">avec le titre dans<strong>. - Si aucune offre n’est publiée :
You have not posted a job yet.
Cliquez sur Run, connectez-vous en tant que ada, puis cliquez sur Your jobs.
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