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 sue pagine di modifica ed eliminazione non lo sono: /3/edit/ e /3/delete/ continuano ad aprire qualsiasi nota. Peggio ancora, non è necessario aprirle affatto. Un modulo invia una richiesta POST e chiunque può inviare una richiesta POST a /3/delete/ senza aver mai visto la pagina.

Quindi la regola vale per ogni vista, non per ogni pagina a cui rimandi: 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 la ricerca lì rifiuta gli estranei, risponde loro con 404 sia per la richiesta GET sia per quella POST, e non viene modificato nulla.

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. Le note di un altro utente restituiscono 404, sia per GET che per POST, e rimangono invariate. Puoi continuare a modificare ed eliminare le tue note.

Premi Run, accedi come bob (password coddy-pass-123) e apri /1/edit/.

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