Menu
CoddyTech

رابط عام

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

تحتاج الملاحظة المشتركة إلى عنوان يمكن لأي شخص فتحه، سواء سجّل الدخول أم لا، ويعرض الملاحظة فقط. تحتوي صفحة المالك على «تعديل» و«حذف»؛ ويجب ألا تحتوي هذه الصفحة عليهما.

لقد استخدمت كل جزء بالفعل. يجب أن تحدد الصفحة ثلاثة أمور: من يمكنه فتحها، وأي ملاحظات يمكنها العثور عليها، والقالب الذي تستخدمه.

اختبرها بصفتك ثلاثة أشخاص: المالك، ومستخدمًا آخر، وزائرًا سجّل الخروج.

challenge icon

التحدي

متوسط

اجعل للملاحظات المشتركة صفحة عامة.

  1. في notes/urls.py، أضف shared/<int:pk>/ باسم shared لـ shared_note.
  2. في notes/views.py، اكتب shared_note مع @login_not_required. يعثر على الملاحظات المشتركة فقط؛ وأي ملاحظة أخرى تُرجع استجابة 404.
  3. اعرض notes/shared_note.html: العنوان والمتن والمالك، من دون روابط Edit أو Delete.
  4. في note_detail.html، ضمن القسم المشترك، اربط Share link بـ notes:shared.

سجّل الخروج وافتح /shared/2/: ستظهر Pancakes، بينما يعطي /shared/1/ استجابة 404.

جرّب بنفسك

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required, permission_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
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):
    if not request.user.is_staff:
        raise PermissionDenied
    context = {"user_count": User.objects.count(), "note_count": Note.objects.count()}
    return render(request, "notes/stats.html", context)


@permission_required("notes.view_note", raise_exception=True)
def all_notes(request):
    notes = Note.objects.select_related("owner")
    return render(request, "notes/all_notes.html", {"notes": notes})


def profile(request):
    note_count = request.user.notes.count()
    return render(request, "notes/profile.html", {"note_count": note_count})
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

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