Menu
CoddyTech

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.

challenge icon

Sfida

Facile

In 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})
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 Utenti e account

Esercitati da solo: Playground Django