للطاقم فقط
جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 12 من 16.
تُحصي الصفحة الجديدة /stats/ المستخدمين والملاحظات. وهي مخصصة للأشخاص الذين يديرون الموقع، ويمكن لأي مستخدم سجّل الدخول فتحها.
تسجيل الدخول مسألة، وما يُسمح للمستخدم بفعله مسألة أخرى. يحتوي User على علامة للأشخاص الذين يديرون الموقع: is_staff، وتكون قيمتها true لمن يُسمح لهم باستخدام لوحة الإدارة.
عندما يطلب مستخدم سجّل الدخول شيئًا لا يُسمح له برؤيته، تكون الاستجابة 403 ممنوع: يعرف الموقع هويتك، ويقول لا. في دالة العرض، ارفع الاستثناء PermissionDenied وسيرسل Django استجابة 403. يرفض المنتدى الردود على موضوع نقاش مغلق:
from django.core.exceptions import PermissionDenied
def thread_reply(request, pk):
thread = get_object_or_404(Thread, pk=pk)
if thread.locked:
raise PermissionDenied
...في القالب، توجد العلامة على user، لذا لا يظهر الرابط إلا للأشخاص المسموح لهم بفتحه. الرابط وسيلة مريحة؛ أما التحقق في دالة العرض فهو وسيلة الحماية.
التحدي
سهلأبقِ /stats/ لموظفي الموقع.
- في
notes/views.py، اجعلstatsيستجيب بالرمز 403 «ممنوع» لأي مستخدم ليس من موظفي الموقع. - في
base.html، أضف بعدNew noteرابطًا بعنوانStatsإلى/stats/، ولا تعرضه إلا لموظفي الموقع.
افتح /stats/ بصفتك ada (من موظفي الموقع): سترى الأعداد. وبصفتك bob: الرمز 403 «ممنوع». كلمة المرور coddy-pass-123.
جرّب بنفسك
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)
جميع دروس المستخدمون والحسابات
تدرّب بنفسك: Playground لـ Django