Menu
CoddyTech

LoginRequiredMixin

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

Pour l’instant, n’importe qui peut publier, modifier ou supprimer une offre d’emploi sans avoir de compte. Une classe n’a pas de fonction unique sur laquelle appliquer @login_required, alors Django vous fournit un mixin : une petite classe que vous ajoutez aux classes parentes d’une vue pour lui apporter un comportement supplémentaire.

from django.contrib.auth.mixins import LoginRequiredMixin


class RecipeCreateView(LoginRequiredMixin, CreateView):
    model = Recipe
    fields = ["title", "minutes"]

Un visiteur qui n’est pas connecté est maintenant redirigé vers /accounts/login/?next=/recipes/new/ avant l’exécution de la vue, aussi bien pour GET que pour POST. Après s’être connecté, next le ramène à la page précédente.

Le mixin doit apparaître en premier. Chaque vue commence par une méthode appelée dispatch(), et Python la recherche dans les classes parentes de gauche à droite. Si vous écrivez (CreateView, LoginRequiredMixin), la méthode dispatch() propre à la vue est prioritaire, la vérification de connexion ne s’exécute jamais et rien ne vous en avertit.

challenge icon

Défi

Moyen

Seuls les utilisateurs connectés peuvent publier, modifier ou supprimer des offres d’emploi :

  • Ajoutez LoginRequiredMixin à JobCreateView, JobUpdateView et JobDeleteView.
  • La liste des offres et les pages des offres restent accessibles à tout le monde.

Cliquez sur Run, puis sur Post a job : vous arrivez sur la page de connexion. Connectez-vous en tant que ada, avec le mot de passe coddy-pass-123.

Essayez vous-même

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(CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobUpdateView(UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django