Menu
CoddyTech

ملاحظة شخص آخر

جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 10 من 16.

تُخفي القائمة ملاحظات الآخرين، لكن صفحات الملاحظات لا تفعل ذلك. أرقام الملاحظات هي /1/ و/2/ و/3/، لذا يمكن لأي شخص تجربة الرقم التالي وقراءتها. لا يكفي إخفاء الروابط في قائمة؛ يجب أن تتحقق كل صفحة.

تقبل get_object_or_404() شروط البحث نفسها التي تقبلها filter()، وبالعدد الذي تريده، ولا تعثر على صف إلا إذا طابقت جميعها. تعرض صفحة المتجر الطلبات التي ما تزال مفتوحة فقط:

order = get_object_or_404(Order, pk=pk, status="open")

يُظهر الطلب المغلق هناك 404 Page not found، وهي الإجابة نفسها التي تظهر لرقم غير موجود. وهذا مقصود بالنسبة إلى صف خاص: إذ إن ظهور 403 Forbidden سيخبر شخصًا غريبًا بأن الصف موجود.

أما Order.objects.get() فستُطلق DoesNotExist بدلًا من ذلك، وسيتلقى الزائر خطأ 500 Server Error، أي سيتعطل التطبيق.

challenge icon

التحدي

سهل

في note_detail، اعرض ملاحظة لمالكها فقط. إذا كانت الملاحظة لشخص آخر أو كان الرقم غير موجود، فستكون الاستجابة 404 في كلتا الحالتين.

اضغط على تشغيل، وسجّل الدخول باسم bob (كلمة المرور coddy-pass-123) وافتح /1/، وهي إحدى ملاحظات ada.

جرّب بنفسك

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
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)
    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)
    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)
    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})

جميع دروس المستخدمون والحسابات

تدرّب بنفسك: Playground لـ Django