Khusus Staf
Termasuk bagian Pengguna dan Akun dalam perjalanan Django di Coddy. Pelajaran 12 dari 16.
Halaman baru /stats/ menghitung jumlah pengguna dan catatan. Halaman ini ditujukan bagi orang-orang yang mengelola situs, dan setiap pengguna yang sudah masuk dapat membukanya.
Status sudah masuk adalah satu hal, sedangkan hal yang boleh dilakukan pengguna adalah hal lain. User memiliki dua flag untuk orang-orang yang mengelola situs: is_staff (boleh menggunakan admin) dan is_superuser (memiliki semua izin).
Saat pengguna yang sudah masuk meminta sesuatu yang mungkin tidak boleh mereka akses, jawabannya adalah 403 Terlarang: "Saya tahu siapa kamu, dan jawabannya tidak". Dalam sebuah view, munculkan PermissionDenied dan Django akan mengirimkan 403. Sebuah forum menolak balasan untuk thread yang dikunci:
from django.core.exceptions import PermissionDenied
def thread_reply(request, pk):
thread = get_object_or_404(Thread, pk=pk)
if thread.locked:
raise PermissionDenied
...Dalam template, flag tersebut berada di user, sehingga tautan hanya dapat ditampilkan kepada orang-orang yang diizinkan membukanya. Tautan itu hanya untuk memudahkan, sedangkan pemeriksaan pada view adalah perlindungannya.
Tantangan
Mudah/stats/menampilkan 403 Forbidden kepada setiap pengguna yang bukan staf.- Di
base.html, setelahNew note, tambahkan tautanStatske sana, yang hanya ditampilkan kepada staf.
Tekan Jalankan, masuk sebagai ada (staf), lalu buka /stats/. Kemudian coba bob. Keduanya menggunakan coddy-pass-123.
Coba sendiri
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)
Semua pelajaran di Pengguna dan Akun
Latihan sendiri: Playground Django