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é.
Défi
MoyenSeuls 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
4Vues de modification
CreateViewArriver sur la nouvelle offre d'emploiEntraînez-vous par vous-même : Playground Django