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 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.

challenge icon

Défi

Moyen

Ajoutez /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 jobs et 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