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 compte. Une classe n’a pas de fonction unique à laquelle appliquer @login_required, alors Django met à votre disposition 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 avec GET qu’avec POST. Après s’être connecté, next le ramène à la page précédente.

Le mixin vient en premier. Chaque vue commence par une méthode appelée dispatch(), et Python recherche cette méthode dans les classes parentes de gauche à droite. Si vous écrivez (CreateView, LoginRequiredMixin), la méthode dispatch() de la vue est prioritaire, la vérification de connexion n’est jamais exécutée et aucun avertissement ne vous est donné.

challenge icon

Défi

Moyen

Seuls les utilisateurs connectés peuvent publier, modifier ou supprimer des offres d’emploi. Dans jobs/views.py, ajoute LoginRequiredMixin à JobCreateView, JobUpdateView et JobDeleteView. La liste des offres et les pages des offres restent accessibles à tout le monde.

Clique sur Post a job : tu arrives sur la page de connexion, où ada se connecte avec 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