Menu
CoddyTech

Seul l'annonceur peut modifier

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 16 sur 18.

Connecte-toi en tant que grace et ouvre /jobs/python-developer-brightline/edit/ : ada a publié cette offre, et grace peut la modifier. Les pages d’offres n’affichent Edit qu’à la personne qui a publié l’offre, mais n’importe qui peut saisir l’adresse ou envoyer une requête POST ; la vue elle-même doit donc refuser.

UserPassesTestMixin appelle une méthode que tu écris, test_func(), avant l’exécution de la vue. Lorsqu’elle renvoie True, la requête est traitée. Lorsqu’elle renvoie False, un utilisateur connecté reçoit une réponse 403 Forbidden, aussi bien pour une requête GET que POST. Un site de recettes ne permet à personne de modifier une recette publiée :

class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Recipe
    fields = ["title", "minutes"]

    def test_func(self):
        return not self.get_object().published

Le test s’exécute avant que la vue ait récupéré la ligne ; self.object n’existe donc pas encore. self.get_object() trouve la ligne à partir de l’URL, comme le fera la vue.

challenge icon

Défi

Moyen

Seule la personne qui a publié une offre d’emploi peut la modifier ou la supprimer. Dans jobs/views.py, ajoute UserPassesTestMixin à JobUpdateView et JobDeleteView, après LoginRequiredMixin. Le test ne réussit que pour la personne qui a publié l’offre d’emploi, et toute autre personne reçoit 403 Forbidden, lors d’une requête GET ou POST.

Connecte-toi en tant que grace (coddy-pass-123) et ouvre /jobs/python-developer-brightline/edit/ : l’offre a été publiée par ada, tu vois donc 403 Forbidden.

Essayez vous-même

from django.contrib.auth.mixins import LoginRequiredMixin
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, UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(LoginRequiredMixin, DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")
quiz iconTestez-vous

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