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.
Défi
MoyenSeuls les utilisateurs connectés peuvent publier, modifier ou supprimer des offres d’emploi :
- Ajoutez
LoginRequiredMixinàJobCreateView,JobUpdateViewetJobDeleteView. - 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
4Vues de modification
CreateViewArriver sur la nouvelle offre d'emploiEntraînez-vous par vous-même : Playground Django