Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Donne à chaque personne qui publie une offre une page avec ses propres offres d’emploi.

  1. Dans jobs/views.py, ajoute MyJobsView, 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.
  2. Crée jobs/my_jobs.html à partir de jobs/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, affiche You have not posted a job yet.
  3. Dans jobs/urls.py, ajoute my-jobs/ avec le nom mine.

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