Menu
CoddyTech

صفحة المؤلفين

جزء من قسم النماذج ولوحة الإدارة في رحلة Django على Coddy. الدرس 22 من 23.

يحتوي رف كتبك على صفحة لكل كتاب، لكن ليس للمؤلفين. ينشئ هذا المشروع صفحةً انطلاقًا مما تعرفه: عرضًا يستعلم من قاعدة البيانات، وعنوان URL، وقالبًا يتبع العلاقات، وQuerySet لا ينفّذ استعلامًا لكل صف.

يُدرج كل مؤلف مع كتبه: حلقة تمر على المؤلفين، وداخلها حلقة تمر على كتب كل مؤلف. من دون مساعدة، تنفّذ الحلقة الداخلية استعلامًا واحدًا لكل مؤلف. لا يمكن لـ select_related() أن يساعد، لأن العلاقة من المؤلف إلى كتبه علاقة عكسية. أما نظيره، prefetch_related()، فيجلب الصفوف المرتبطة بكل عنصر في القائمة باستعلام إضافي واحد. يجلب Book.objects.prefetch_related("loans") قروض كل كتاب باستعلام إضافي واحد. وهو يأخذ اسم العلاقة.

توضح المهمة ما الذي يجب أن تفعله الصفحة؛ أما الشيفرة فهي من إعدادك.

challenge icon

التحدي

متوسط

أنشئ صفحة للمؤلفين.

  1. في books/views.py، اكتب author_list: اعرض books/author_list.html مع جميع المؤلفين، باستخدام prefetch_related().
  2. في books/urls.py، أضف authors/ باسم authors.
  3. في author_list.html، أنشئ لكل مؤلف <section class="author">: ضَع الاسم في <h2>، وعنصر <li> لكل كتاب يربط عنوانه بصفحته.
  4. في books/base.html، أضف رابطًا إلى المؤلفين في <header>.

انقر على المؤلفين: يعرض Herbert كتابَي Children of Dune وDune.

جرّب بنفسك

from django.shortcuts import get_object_or_404, render

from .models import Book


def home(request):
    books = Book.objects.select_related("author")
    return render(request, "books/home.html", {"books": books})


def book_detail(request, pk):
    book = get_object_or_404(Book, pk=pk)
    return render(request, "books/book_detail.html", {"book": book})


def search(request):
    q = request.GET.get("q", "")
    books = Book.objects.filter(title__icontains=q).select_related("author")
    return render(request, "books/search.html", {"q": q, "books": books})

جميع دروس النماذج ولوحة الإدارة

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