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().publishedIl 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.
Sfida
MedioSolo 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")
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
4Viste di modifica
CreateViewArrivare alla nuova offerta di lavoroEsercitati da solo: Playground Django