Menu
CoddyTech

Die Notiz einer anderen Person

Teil des Abschnitts Benutzer und Konten der Django-Journey von Coddy. Lektion 10 von 16.

Die Liste blendet die Notizen anderer Personen aus, die Notizseiten jedoch nicht. Die Notizen sind mit /1/, /2/, /3/ nummeriert, sodass jeder die nächste Nummer ausprobieren und die Notiz lesen kann. Eine Liste, die Links ausblendet, reicht nicht aus: Jede Seite muss selbst prüfen.

get_object_or_404() akzeptiert dieselben Suchkriterien wie filter(), beliebig viele, und findet eine Zeile nur, wenn sie alle erfüllen. Eine Shop-Seite zeigt nur Bestellungen an, die noch offen sind:

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

Bei einer geschlossenen Bestellung erscheint dort die Meldung 404 Seite nicht gefunden, dieselbe Meldung wie bei einer nicht existierenden Nummer. Bei einer privaten Zeile ist das beabsichtigt: Ein 403 Forbidden würde einem Fremden verraten, dass die Zeile existiert.

Order.objects.get() würde stattdessen DoesNotExist auslösen, und der Besucher würde einen 500 Serverfehler erhalten – einen Absturz.

challenge icon

Aufgabe

Einfach

Zeige in note_detail eine Notiz nur ihrem Besitzer an. Bei der Notiz einer anderen Person und bei einer nicht existierenden Nummer wird jeweils 404 zurückgegeben.

Klicke auf „Run“, melde dich als bob an (Passwort coddy-pass-123) und öffne /1/, eine der Notizen von ada.

Probier es selbst

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

Alle Lektionen in Benutzer und Konten

Übe selbstständig: Django-Playground