Menu
CoddyTech

LoginRequiredMixin

Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 14 de 18.

Agora mesmo, qualquer pessoa pode publicar, editar ou excluir uma vaga sem ter uma conta. Uma classe não tem uma única função à qual você possa adicionar @login_required, então o Django oferece um mixin: uma classe pequena que você adiciona às classes-pai de uma view para incluir um comportamento extra.

from django.contrib.auth.mixins import LoginRequiredMixin


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

Agora, um visitante que não estiver conectado será redirecionado para /accounts/login/?next=/recipes/new/ antes de a view ser executada, tanto em GET quanto em POST. Depois de fazer login, next o leva de volta.

O mixin vem primeiro. Toda view começa em um método chamado dispatch(), e o Python procura esse método nas classes-pai da esquerda para a direita. Se você escrever (CreateView, LoginRequiredMixin), o próprio dispatch() da view prevalece, a verificação de login nunca é executada e nada avisa você.

challenge icon

Desafio

Médio

Somente usuários conectados podem publicar, editar ou excluir vagas:

  • Adicione LoginRequiredMixin a JobCreateView, JobUpdateView e JobDeleteView.
  • A lista de vagas e as páginas das vagas continuam abertas para todos.

Clique em Run e clique em Post a job: você será direcionado à página de login. Entre como ada, com a senha coddy-pass-123.

Experimente você mesmo

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")

Todas as lições de Views baseadas em classes

Pratique por conta própria: Playground de Django