Menu
CoddyTech

La note de quelqu’un d’autre

Fait partie de la section Utilisateurs et comptes du Journey Django de Coddy. Leçon 10 sur 16.

La liste masque les notes des autres, mais pas les pages des notes. Les notes sont numérotées /1/, /2/, /3/ : n’importe qui peut donc essayer le numéro suivant et la lire. Masquer les liens dans une liste ne suffit pas : chaque page doit effectuer une vérification.

get_object_or_404() accepte les mêmes critères de recherche que filter(), autant que vous le souhaitez, et ne trouve une ligne que lorsque tous ces critères correspondent. Une page de boutique n’affiche que les commandes qui sont encore ouvertes :

order = get_object_or_404(Order, pk=pk, status="open")

Une commande clôturée renvoie alors 404 Page not found, comme un numéro de commande inexistant. C’est intentionnel pour une ligne privée : une erreur 403 Forbidden indiquerait à un inconnu que la ligne existe.

Order.objects.get() lèverait plutôt une exception DoesNotExist, et le visiteur obtiendrait une erreur 500 Server Error, c’est-à-dire un plantage.

challenge icon

Défi

Facile

Dans note_detail, affichez une note uniquement à son propriétaire. Si la note appartient à quelqu’un d’autre ou si ce numéro n’existe pas, la page répond avec une erreur 404.

Connectez-vous en tant que bob (mot de passe coddy-pass-123) et ouvrez /1/, l’une des notes d’ada : page 404 introuvable.

Essayez vous-même

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)
    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})

Toutes les leçons de Utilisateurs et comptes

Entraînez-vous par vous-même : Playground Django