Menu
CoddyTech

للطاقم فقط

جزء من قسم المستخدمون والحسابات في رحلة 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، لذا لا يظهر الرابط إلا للأشخاص المسموح لهم بفتحه. الرابط وسيلة مريحة؛ أما التحقق في دالة العرض فهو وسيلة الحماية.

challenge icon

التحدي

سهل

أبقِ /stats/ لموظفي الموقع.

  1. في notes/views.py، اجعل stats يستجيب بالرمز 403 «ممنوع» لأي مستخدم ليس من موظفي الموقع.
  2. في 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