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 Nutzer und Notizen. Sie ist für die Personen gedacht, die die Website betreiben, und jeder angemeldete Nutzer kann sie öffnen.

Angemeldet zu sein ist eine Sache; was ein Nutzer tun darf, eine andere. User hat ein Flag für die Personen, die eine Website betreiben: is_staff, das für diejenigen auf true gesetzt ist, die den Adminbereich nutzen dürfen.

Wenn ein angemeldeter Nutzer etwas anfordert, das er nicht sehen darf, lautet die Antwort 403 Forbidden: Die Website weiß, wer du bist, und sagt Nein. Löse in einer View PermissionDenied aus, und Django sendet den 403-Status. 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 befindet sich das Flag auf user, sodass ein Link nur den Personen angezeigt werden kann, die ihm folgen dürfen. Der Link ist eine praktische Abkürzung; die Prüfung in der View ist der Schutz.

challenge icon

Aufgabe

Einfach

Behalte /stats/ für Mitarbeitende bei.

  1. Sorge in notes/views.py dafür, dass stats jedem Nutzer, der kein Mitarbeiter ist, mit 403 Verboten antwortet.
  2. Füge in base.html nach New note einen Link Stats zu /stats/ hinzu, der nur Mitarbeitenden angezeigt wird.

Rufe /stats/ als ada (Mitarbeiterin) auf: Du siehst die Anzahlen. Als bob: 403 Verboten. Passwort: 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