Menu
CoddyTech

صفحة الملف الشخصي

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

في هذا الفصل، ستضيف ميزات اعتمادًا على ما تعرفه، وبمساعدة أقل. أولًا، صفحة خاصة بك: من سجّل الدخول وكم ملاحظة كتب. كل ما تحتاج إليه موجود لدى المستخدم الذي سجّل الدخول: اسم المستخدم وملاحظاته عبر related_name في حقل المالك.

لعرض عدد الصفوف، اطلب من قاعدة البيانات حسابها. في موقع مكتبة، ينفّذ author.books.count() استعلام SELECT COUNT(*) واحدًا. يعطي len(author.books.all()) العدد نفسه، لكنه يحمّل كل كتاب أولًا.

في الإنجليزية، نستخدم 1 book لكن 2 books. يضيف مرشّح القالب pluralize الحرف s ما لم يكن العدد 1: book{{ count|pluralize }}. وتُكتب نهاية أخرى بين علامتي اقتباس: box{{ count|pluralize:"es" }}.

challenge icon

التحدي

متوسط

أضف صفحة ملف شخصي على /profile/، باسم profile:

  • عنصر <h1> يحتوي على اسم المستخدم.
  • You have 2 notes. مع عدد ملاحظات المستخدم نفسه: You have 1 note. لواحدة، وYou have 0 notes. عند عدم وجود ملاحظات.
  • في الترويسة، أضف رابطًا Profile إليها بعد Signed in as ....

اضغط على Run وافتح /profile/ بصفتك ada، ثم بصفتك bob (كلمة المرور coddy-pass-123).

جرّب بنفسك

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})

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

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