Solo il proprietario può modificare
Fa parte della sezione Utenti e account del percorso Django di Coddy. Lezione 11 di 16.
La pagina di una nota ora è protetta, ma le pagine per modificarla ed eliminarla non lo sono: /3/edit/ e /3/delete/ permettono ancora di aprire qualsiasi nota. Peggio ancora, non è nemmeno necessario aprirle. Un modulo invia una richiesta POST e chiunque può inviare una richiesta POST a /3/delete/ senza nemmeno visualizzare la pagina.
Quindi la regola vale per ogni vista, non per ogni pagina a cui rimanda un collegamento: ogni vista che carica una riga in base al suo numero decide lì chi può caricarla. Guarda dove si trova la ricerca in una vista che gestisce sia GET sia POST:
def ticket_close(request, pk):
ticket = ... # la ricerca: viene eseguita per ogni richiesta
if request.method == "POST":
ticket.closed = True
ticket.save()
return redirect("tickets:list")
return render(request, "tickets/close.html", {"ticket": ticket})La prima riga viene eseguita prima del ramo if request.method == "POST". Se anche quella ricerca verifica chi è il proprietario, un estraneo riceve un errore 404 per la richiesta GET e per quella POST, e nulla cambia.
Sfida
FacileIn notes/views.py, fai in modo che note_edit e note_delete rifiutino le note che non appartengono all'utente. In questo caso, la nota di un altro utente restituisce 404, sia per GET che per POST, e rimane invariata. Puoi comunque modificare ed eliminare le tue note.
Accedi come bob (password coddy-pass-123) e apri /1/edit/: 404 Pagina non trovata.
Provalo tu
from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import get_object_or_404, redirect, render
from .forms import NoteForm
from .models import Note
def note_list(request):
notes = Note.objects.filter(owner=request.user)
return render(request, "notes/note_list.html", {"notes": notes})
def note_detail(request, pk):
note = get_object_or_404(Note, pk=pk, owner=request.user)
return render(request, "notes/note_detail.html", {"note": note})
def note_create(request):
if request.method == "POST":
form = NoteForm(request.POST)
if form.is_valid():
note = form.save(commit=False)
note.owner = request.user
note.save()
return redirect("notes:detail", pk=note.pk)
else:
form = NoteForm()
return render(request, "notes/note_form.html", {"form": form})
def note_edit(request, pk):
note = get_object_or_404(Note, pk=pk)
if request.method == "POST":
form = NoteForm(request.POST, instance=note)
if form.is_valid():
form.save()
return redirect("notes:detail", pk=note.pk)
else:
form = NoteForm(instance=note)
return render(request, "notes/note_form.html", {"form": form, "note": note})
def note_delete(request, pk):
note = get_object_or_404(Note, pk=pk)
if request.method == "POST":
note.delete()
return redirect("notes:list")
return render(request, "notes/note_confirm_delete.html", {"note": note})
@login_not_required
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("notes:list")
else:
form = UserCreationForm()
return render(request, "notes/signup.html", {"form": form})
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Utenti e account
3I tuoi dati
Una nota ha un proprietarioSolo le mie noteEsercitati da solo: Playground Django