Menu
CoddyTech

Nur für Mitarbeiter

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

Die neue Seite /stats/ zählt Benutzer und Notizen. Sie ist für die Personen gedacht, die die Website betreiben, und jeder angemeldete Benutzer kann sie öffnen.

Angemeldet zu sein ist eine Sache; was ein Benutzer tun darf, eine andere. User hat zwei Flags für die Personen, die eine Website betreiben: is_staff (darf die Administration verwenden) und is_superuser (hat alle Berechtigungen).

Wenn ein angemeldeter Benutzer etwas anfordert, wozu er möglicherweise nicht berechtigt ist, lautet die Antwort 403 Forbidden: „Ich weiß, wer du bist, und nein.“ Löse in einer View PermissionDenied aus, und Django sendet den 403-Fehler. Ein Forum verweigert Antworten auf einen gesperrten Thread:

from django.core.exceptions import PermissionDenied


def thread_reply(request, pk):
    thread = get_object_or_404(Thread, pk=pk)
    if thread.locked:
        raise PermissionDenied
    ...

In einem Template befinden sich die Flags auf user, sodass ein Link nur den Personen angezeigt werden kann, die ihm folgen dürfen. Der Link ist eine praktische Hilfe; die Prüfung in der View sorgt für den Schutz.

challenge icon

Aufgabe

Einfach
  • /stats/ antwortet allen Benutzern, die keine Mitarbeitenden sind, mit 403 Forbidden.
  • In base.html einen Link Stats darauf nach New note einfügen, der nur Mitarbeitenden angezeigt wird.

Klicke auf Run, melde dich als ada (Mitarbeiterin) an und öffne /stats/. Versuche es dann mit bob. Beide verwenden coddy-pass-123.

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.contrib.auth.models import User
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, owner=request.user)
    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, owner=request.user)
    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})


def stats(request):
    context = {"user_count": User.objects.count(), "note_count": Note.objects.count()}
    return render(request, "notes/stats.html", context)

Alle Lektionen in Benutzer und Konten

Übe selbstständig: Django-Playground