LoginRequiredMixin
Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 14 de 18.
No momento, qualquer pessoa pode publicar, editar ou excluir uma vaga sem ter uma conta. Uma classe não tem uma única função na qual você possa colocar @login_required, então o Django oferece um mixin: uma pequena classe que você adiciona às classes-pai de uma view para acrescentar um comportamento.
from django.contrib.auth.mixins import LoginRequiredMixin
class RecipeCreateView(LoginRequiredMixin, CreateView):
model = Recipe
fields = ["title", "minutes"]Agora, um visitante que não fez login é redirecionado para /accounts/login/?next=/recipes/new/ antes que a view seja executada, tanto em GET quanto em POST. Depois de fazer login, next o leva de volta.
O mixin deve vir primeiro. Toda view começa em um método chamado dispatch(), e o Python procura por ele 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ê.
Desafio
MédioApenas usuários conectados podem publicar, editar ou excluir vagas. Em jobs/views.py, adicione LoginRequiredMixin a JobCreateView, JobUpdateView e JobDeleteView. A lista de vagas e as páginas das vagas continuam abertas para todos.
Pressione Post a job: você será direcionado à página de login, onde ada entra com 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
4Views de edição
CreateViewAcessando a nova vagaPratique por conta própria: Playground de Django