Menu
CoddyTech

Solo chi ha pubblicato può modificare

Fa parte della sezione View basate su classi del percorso Django di Coddy. Lezione 16 di 18.

Accedi come grace e apri /jobs/python-developer-brightline/edit/: ada ha pubblicato quell'offerta di lavoro e grace può modificarla. Le pagine delle offerte mostrano «Modifica» solo a chi le ha pubblicate, ma chiunque può digitare l'indirizzo o inviare una richiesta POST, quindi la vista stessa deve rifiutarla.

UserPassesTestMixin chiama un metodo che scrivi tu, test_func(), prima che venga eseguita la vista. Quando restituisce True, la richiesta viene elaborata. Quando restituisce False, un utente che ha effettuato l'accesso riceve una risposta 403 Forbidden, sia per una richiesta GET che per una POST. Un sito di ricette non permette a nessuno di modificare una ricetta pubblicata:

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

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

Il test viene eseguito prima che la vista abbia recuperato la riga, quindi self.object non esiste ancora. self.get_object() trova la riga dall'URL, proprio come farà la vista.

challenge icon

Sfida

Medio

Solo chi ha pubblicato un annuncio di lavoro può modificarlo o eliminarlo. In jobs/views.py, aggiungi UserPassesTestMixin a JobUpdateView e JobDeleteView, dopo LoginRequiredMixin. Il test viene superato solo dall’utente che ha pubblicato l’annuncio di lavoro; chiunque altro riceve 403 Forbidden, sia con GET sia con POST.

Accedi come grace (coddy-pass-123) e apri /jobs/python-developer-brightline/edit/: l’annuncio è stato pubblicato da ada, quindi vedrai 403 Forbidden.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di View basate su classi

Esercitati da solo: Playground Django