Menu
CoddyTech

Somente o autor pode editar

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

Entre como grace e abra /jobs/python-developer-brightline/edit/: ada publicou essa vaga, e grace pode alterá-la. As páginas de vagas mostram Edit apenas para quem publicou a vaga, mas qualquer pessoa pode digitar o endereço ou enviar um POST, então a própria view precisa recusar.

UserPassesTestMixin chama um método que você escreve, test_func(), antes de a view ser executada. Quando ele retorna True, a solicitação é aceita. Quando retorna False, um usuário conectado recebe uma resposta 403 Forbidden, tanto para um GET quanto para um POST. Um site de receitas não permite que ninguém altere uma receita publicada:

class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Recipe
    fields = ["title", "minutes"]

    def test_func(self):
        return not self.get_object().published

O teste é executado antes de a view buscar a linha, então self.object ainda não existe. self.get_object() encontra a linha a partir da URL, da mesma forma que a view fará.

challenge icon

Desafio

Médio

Somente quem publicou uma vaga pode editá-la ou excluí-la. Em jobs/views.py, adicione UserPassesTestMixin a JobUpdateView e JobDeleteView, depois de LoginRequiredMixin. O teste é aprovado somente para o usuário que publicou a vaga, e qualquer outra pessoa recebe 403 Forbidden, em GET e POST.

Faça login como grace (coddy-pass-123) e abra /jobs/python-developer-brightline/edit/: ada publicou a vaga, então você verá 403 Forbidden.

Experimente você mesmo

from django.contrib.auth.mixins import LoginRequiredMixin
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(LoginRequiredMixin, CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]

    def form_valid(self, form):
        form.instance.posted_by = self.request.user
        return super().form_valid(form)


class JobUpdateView(LoginRequiredMixin, UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(LoginRequiredMixin, DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Views baseadas em classes

Pratique por conta própria: Playground de Django